#include using namespace std; const int N = 1e5 + 10; #define int long long #define endl "\n" vector g[N]; // 邻接表,存图 int sz[N]; // sz[i]:以i为根的子树中节点个数 int son[N]; // son[i]:去掉节点i后,剩下的连通分量中最大子树节点个数 int r1, r2, n; void dfs(int u, int fa) { sz[u] = 1; // u为根的子树中,最起码有一个节点u son[u] = 0; // 把节点u去掉后,剩下的连通分量中最大子树节点个数现在还不知道,预求最大,先设最小 for (int i = 0; i < g[u].size(); i++) { // 枚举u的每一条出边 int v = g[u][i]; if (v == fa) continue; dfs(v, u); sz[u] += sz[v]; son[u] = max(son[u], sz[v]); } son[u] = max(son[u], n - sz[u]); if ((son[u] << 1) <= n) r2 = r1, r1 = u; } signed main() { int T; cin >> T; while (T--) { cin >> n; // 多组测试数据,清空 memset(sz, 0, sizeof sz); memset(son, 0, sizeof son); r1 = r2 = 0; for (int i = 0; i <= n + 10; i++) g[i].clear(); for (int i = 1; i < n; i++) { // n-1条边 int x, y; cin >> x >> y; g[x].push_back(y); g[y].push_back(x); } dfs(1, 0); // 以1号点为入口,它的父节点是0 if (!r2) { int r3 = g[r1][0]; cout << r1 << " " << r3 << endl; cout << r1 << " " << r3 << endl; } else { int r3 = r1; for (int i = 0; i < g[r2].size(); i++) { r3 = g[r2][i]; if (r3 != r1) break; } cout << r3 << " " << r2 << endl; cout << r3 << " " << r1 << endl; } } return 0; }