#include <bits/stdc++.h>
using namespace std;
struct Edge {
  int to, next;
} bus[404040];
int n, s1[202002], s2[202020], st[202020], deg[202020], dep[202020],
    flo[202020], di[202020], fa[202020];
int leaf[202002];
int l[202020], bs[202020], ans = 0, w1, w2, root;
queue<int> q;
void dfs(int now) {
  for (int i = st[now]; i; i = bus[i].next) {
    if (bus[i].to == fa[now]) continue;
    if (leaf[bus[i].to] == 1) continue;
    int x = bus[i].to;
    fa[x] = now;
    dfs(x);
    if (!bs[now]) {
      bs[now] = x;
      continue;
    }
    if (l[x] + l[bs[now]] + 1 > ans)
      ans = l[x] + l[bs[now]] + 1, w1 = di[bs[now]], w2 = di[x];
    if (l[x] + l[bs[now]] + 1 == ans &&
        dep[s1[di[x]]] + dep[s2[di[x]]] + dep[s1[di[bs[now]]]] +
                dep[s2[di[bs[now]]]] >
            dep[s1[w1]] + dep[s2[w2]] + dep[s1[w2]] + dep[s2[w1]])
      w1 = di[bs[now]], w2 = di[x];
    if (l[x] > l[bs[now]] ||
        (l[x] == l[bs[now]] && dep[s1[di[x]]] + dep[s2[di[x]]] >
                                   dep[s1[di[bs[now]]]] + dep[s2[di[bs[now]]]]))
      bs[now] = x;
  }
  if (bs[now]) {
    l[now] = l[bs[now]] + 1;
    di[now] = di[bs[now]];
    if (!leaf[now]) return;
    if (ans < l[now]) ans = l[now], w1 = now, w2 = di[now];
    if (ans == l[now] &&
        dep[s1[now]] + dep[s2[now]] + dep[s1[di[now]]] + dep[s2[di[now]]] >
            dep[s1[w1]] + dep[s2[w2]] + dep[s1[w2]] + dep[s2[w1]])
      w1 = di[now], w2 = now;
  } else {
    l[now] = 1;
    di[now] = now;
  }
}
int z = 0;
inline void AddE(int from, int to) {
  bus[++z].to = to;
  bus[z].next = st[from];
  st[from] = z;
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n;
  di[0] = 100;
  int aa, bb;
  for (int i = 1; i < n; i++) {
    cin >> aa >> bb;
    AddE(aa, bb);
    AddE(bb, aa);
    deg[aa]++;
    deg[bb]++;
  }
  for (int i = 1; i <= n; i++)
    if (deg[i] == 1) {
      q.push(i);
      flo[i] = i;
      leaf[i] = 1;
      dep[i] = 1;
    }
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    for (int i = st[x]; i; i = bus[i].next) {
      if (leaf[bus[i].to] == 1) continue;
      if (deg[bus[i].to] == 2) {
        q.push(bus[i].to);
        dep[bus[i].to] = dep[x] + 1;
        flo[bus[i].to] = flo[x];
        leaf[bus[i].to] = 1;
      } else {
        if (dep[x] > dep[s2[bus[i].to]]) s2[bus[i].to] = x;
        if (dep[s2[bus[i].to]] > dep[s1[bus[i].to]])
          swap(s1[bus[i].to], s2[bus[i].to]);
        leaf[bus[i].to] = 2;
      }
    }
  }
  for (int i = 1; i < n; i++)
    if (deg[i] > 2) {
      root = i;
      dfs(i);
      break;
    }
  cout << flo[s1[w1]] << " " << flo[s1[w2]] << endl;
  cout << flo[s2[w1]] << " " << flo[s2[w2]] << endl;
  if (!flo[s2[w2]]) cout << s2[w2] << " " << w2 << " " << leaf[w2] << endl;
  return 0;
}
