# Include <iostream> # include <cstring> # include <cstdio> # include <map> # include <string> # include <algorithm> # define N 10001 using namespace std; int head [N], num, dfs [N], low [N], n, m, idx, bridge [N], bum; struct edge {int st, ed, next;} E [N * 20]; void addedge (int x, int y) {E [num]. st = x; E [num]. ed = y; E [num]. next = head [x]; head [x] = num ++;} int cmp (const void * a, const void * B) {return * (int *) a-* (int *) B;} void Tarjan (int u, int Father) {int I, v; low [u] = dfs [u] = idx ++; for (I = head [u]; I! =-1; I = E [I]. next) {v = E [I]. ed; if (v = father) continue; if (dfs [v] =-1) {Tarjan (v, u ); low [u] = low [u]> low [v]? Low [v]: low [u]; if (low [v]> dfs [u]) // bridge {bridge [bum ++] = I ;}} else low [u] = low [u]> dfs [v]? Dfs [v]: low [u] ;}} int main () {int I, x, y, j, t, sum; char str [2] [200]; scanf ("% d", & t); while (t --) {scanf ("% d", & n, & m); memset (head,-1, sizeof (head); num = 0; sum = 1; map <string, int> mp; map <int, string> mmp; for (I = 0; I <m; I ++) {scanf ("% s", str [0], str [1]); if (mp [str [0] = 0) {mp [str [0] = sum; mmp [sum] = str [0]; sum ++;} if (mp [str [1] = 0) {mp [str [1] = sum; mmp [sum] = str [1]; sum ++;} x = mp [str [0]; y = mp [str [1]; addedge (x, y); addedge (y, x);} m Emset (dfs,-1, sizeof (dfs); idx = 0; bum = 0; Tarjan (1,-1); for (I = 1; I <= n; I ++) {if (dfs [I] =-1) break;} if (I <= n) {printf ("0 \ n"); continue ;} printf ("% d \ n", bum); qsort (bridge, bum, sizeof (bridge [0]), cmp); for (j = 0; j <bum; j ++) {I = bridge [j]; I = (I/2*2); x = E [I]. st; y = E [I]. ed; if (x! = Y) printf ("% s \ n", mmp [E [I]. st]. c_str (), mmp [E [I]. ed]. c_str () ;}} return 0 ;}