#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
priority_queue<pair<int, int>, vector<pair<int, int> >,
               greater<pair<int, int> > >
    que;
stringstream ssin;
const int N = 5e5 + 5, M = 1e6 + 5, mod = 1e9 + 7, INF = 0x3f3f3f3f;
int _, n, idx;
pair<int, int> c[N];
int h[N], ne[M], e[M];
int Size[N], dp[N], Min, f1, f2, allnode;
inline int read() {
  char c = getchar();
  int x = 0, f = 1;
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    x = x * 10 + c - '0';
    c = getchar();
  }
  return x * f;
}
void add(int a, int b) {
  e[idx] = b;
  ne[idx] = h[a];
  h[a] = idx++;
}
void init() {
  idx = 0;
  memset(h, -1, sizeof h);
  ;
}
void getf(int u, int fa) {
  Size[u] = 1;
  dp[u] = 0;
  for (int i = h[u]; ~i; i = ne[i]) {
    int v = e[i];
    if (v == fa) continue;
    getf(v, u);
    Size[u] += Size[v];
    dp[u] = max(dp[u], Size[v]);
  }
  dp[u] = max(dp[u], allnode - Size[u]);
  if (Min > dp[u]) {
    Min = dp[u];
    f1 = u;
    f2 = 0;
  } else if (Min == dp[u]) {
    f2 = u;
  }
}
int main() {
  _ = read();
  while (_--) {
    init();
    n = read();
    for (int i = 1; i < n; ++i) {
      int a, b;
      a = read();
      b = read();
      add(a, b);
      add(b, a);
      c[i] = make_pair(a, b);
    }
    f1 = 0;
    f2 = 0;
    allnode = n;
    Min = 1e9;
    getf(1, -1);
    if (!f2) {
      printf("%d %d\n", c[1].first, c[1].second);
      printf("%d %d\n", c[1].first, c[1].second);
    } else {
      int g1, g2;
      for (int i = h[f1]; ~i; i = ne[i]) {
        int v = e[i];
        if (v == f2) continue;
        g1 = v;
        break;
      }
      printf("%d %d\n", g1, f1);
      printf("%d %d\n", g1, f2);
    }
  }
}
