#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = (x << 1) + (x << 3) + ch - '0';
    ch = getchar();
  }
  return x * f;
}
const int maxn = 2e5 + 1e2;
const int maxm = 4e5 + 1e2;
struct Node {
  int tag, val, id, dep;
};
int cnt, n, m;
int point[maxn], nxt[maxm], to[maxm];
int deep[maxn];
int mxpos[maxn], mx[maxn], wei[maxn];
int mxpos1[maxn], mx1[maxn];
int s, t;
int x, y;
int tag[maxn];
Node a[maxn];
int tmp;
int ans;
int ymh[maxn];
int oo[maxn];
void addedge(int x, int y) {
  nxt[++cnt] = point[x];
  to[cnt] = y;
  point[x] = cnt;
}
void dfs(int x, int fa, int dep) {
  int num = 0;
  deep[x] = dep;
  for (int i = point[x]; i; i = nxt[i]) {
    int p = to[i];
    if (p == fa) continue;
    if (oo[p]) continue;
    num++;
    dfs(p, x, dep + 1);
    if (mx[x] < mx[p])
      mx1[x] = mx[x], mxpos1[x] = mxpos[x], mx[x] = mx[p], mxpos[x] = mxpos[p];
    else if (mx1[x] < mx[p])
      mx1[x] = mx[p], mxpos1[x] = mxpos[p];
  }
  if (num == 0) {
    mx[x] = deep[x];
    mxpos[x] = x;
  }
  if (num >= 2) {
    ++tmp;
    a[tmp].tag = 1;
    a[tmp].val = mx1[x] + mx[x];
    a[tmp].id = x;
    ymh[x] = 1;
    a[tmp].dep = deep[x];
  }
}
int ans1;
bool cmp(Node a, Node b) {
  if (a.dep == b.dep) return a.val > b.val;
  return a.dep > b.dep;
}
void dfs1(int x, int fa, int dis) {
  if (x != s && ymh[x]) {
    if (dis > ans)
      ans = dis, ans1 = mx1[x] + mx[x], t = x;
    else if (dis == ans) {
      if (ans1 < mx1[x] + mx[x]) ans = dis, ans1 = mx1[x] + mx[x], t = x;
    }
  }
  for (int i = point[x]; i; i = nxt[i]) {
    int p = to[i];
    if (p == fa) continue;
    dfs1(p, x, dis + 1);
  }
}
int main() {
  n = read();
  for (int i = 1; i < n; i++) {
    int u = read(), v = read();
    addedge(u, v);
    addedge(v, u);
  }
  dfs(1, 0, 0);
  sort(a + 1, a + 1 + tmp, cmp);
  int s = a[1].id;
  oo[s] = 1;
  int a1 = mxpos[s], a2 = mxpos1[s];
  memset(mx, 0, sizeof(mx));
  memset(mx1, 0, sizeof(mx1));
  tmp = 0;
  memset(a, 0, sizeof(a));
  dfs(s, 0, 1);
  sort(a + 1, a + 1 + tmp, cmp);
  int t = a[1].id;
  cout << a1 << " " << mxpos[t] << endl;
  cout << a2 << " " << mxpos1[t] << endl;
  return 0;
}
