#include using namespace std; vector> create_map(int N, int M, vector A, vector B) { vector> adj(N + 1); for (int i = 0; i < M; i++) { int a = A[i], b = B[i]; adj[a].insert(b); adj[b].insert(a); } int root = 1; vector> tree(N + 1); vector visited(N + 1, false); vector parent(N + 1, -1); queue qq; qq.push(root); visited[root] = true; while (!qq.empty()) { int u = qq.front(); qq.pop(); for (int v : adj[u]) { if (!visited[v]) { visited[v] = true; parent[v] = u; tree[u].push_back(v); qq.push(v); } } } vector sub_height(N + 1), sub_width(N + 1); function comp_size = [&](int u, int p) { int numc = tree[u].size(); int maxch = 0; int sumcw = 0; int nsep = max(0, numc - 1); for (int v : tree[u]) { comp_size(v, u); maxch = max(maxch, sub_height[v]); sumcw += sub_width[v]; } int hchild = (numc == 0 ? 0 : maxch); sub_height[u] = 3 + hchild; int wchild = (numc == 0 ? 0 : sumcw + nsep); int deg = adj[u].size(); int wblock = (deg == 0 ? 1 : 3 * deg); sub_width[u] = max(wblock, wchild); }; comp_size(root, -1); int toth = sub_height[root]; int totw = sub_width[root]; int K = max(toth, totw); vector> C(K, vector(K, 0)); function do_place = [&](int u, int r0, int c0) { int sw = sub_width[u]; int deg = adj[u].size(); int wb = (deg == 0 ? 1 : 3 * deg); for (int i = 0; i < 3; i++) { int rr = r0 + i; if (rr >= K) continue; for (int j = 0; j < sw; j++) { int cc = c0 + j; if (cc >= K) break; C[rr][cc] = u; } } vector neigh(adj[u].begin(), adj[u].end()); int d = neigh.size(); int pstart = c0; for (int k = 0; k < d; k++) { int v = neigh[k]; int pc = pstart + 3 * k + 1; if (pc < c0 + sw && pc < K) { int rr = r0 + 1; if (rr < K) C[rr][pc] = v; } } auto& children = tree[u]; int numc = children.size(); if (numc == 0) return; int r1 = r0 + 3; if (r1 >= K) return; int maxch = 0; for (int v : children) maxch = max(maxch, sub_height[v]); vector ch_starts(numc); int this_c = c0; int wchild_actual = 0; for (int i = 0; i < numc; i++) { int v = children[i]; ch_starts[i] = this_c; do_place(v, r1, this_c); this_c += sub_width[v]; wchild_actual += sub_width[v]; if (i < numc - 1) { int sep_c = this_c; for (int rr = r1; rr < r1 + maxch && rr < K; rr++) { if (sep_c < K) C[rr][sep_c] = u; } this_c++; wchild_actual++; } } for (int i = 0; i < numc; i++) { int v = children[i]; int startc = ch_starts[i]; int endc = startc + sub_width[v] - 1; int child_h = sub_height[v]; int gap_start_r = r1 + child_h; for (int rr = gap_start_r; rr < r1 + maxch && rr < K; rr++) { for (int cc = startc; cc <= endc && cc < K; cc++) { C[rr][cc] = v; } } } int children_end_c = c0 + wchild_actual; for (int rr = r1; rr < r1 + maxch && rr < K; rr++) { for (int cc = children_end_c; cc < c0 + sw && cc < K; cc++) { C[rr][cc] = u; } } }; do_place(root, 0, 0, C); if (toth < K) { for (int r = toth; r < K; r++) { for (int j = 0; j < K; j++) { C[r][j] = C[toth - 1][j]; } } } if (totw < K) { for (int j = totw; j < K; j++) { for (int i = 0; i < K; i++) { C[i][j] = C[i][totw - 1]; } } } return C; } int main() { int T; cin >> T; for (int t = 0; t < T; t++) { int N, M; cin >> N >> M; vector AA(M), BB(M); for (int i = 0; i < M; i++) { cin >> AA[i] >> BB[i]; } auto cmap = create_map(N, M, AA, BB); int KK = cmap.size(); cout << KK << endl; for (int q = 0; q < KK; q++) { if (q > 0) cout << " "; cout << KK; } cout << endl; cout << endl; for (int i = 0; i < KK; i++) { for (int j = 0; j < KK; j++) { if (j > 0) cout << " "; cout << cmap[i][j]; } cout << endl; } } return 0; }