#include <bits/stdc++.h>
using namespace std;
int n, a, b, cnt, root, head[200005], ma1[200005], ma2[200005], id1[200005],
    id2[200005], size[200005], val[200005];
bool isleaf[200005], f1[200005], f2[200005], used[200005];
struct node {
  int to, next;
} e[200005 << 1];
void insert(int u, int v) {
  e[++cnt].to = v;
  e[cnt].next = head[u];
  head[u] = cnt;
}
class Graph {
 public:
  int cnt, head[200005], deep[200005], ID, maxdeep, maxval, ans;
  struct edge {
    int to, next;
  } e[200005 << 1];
  void add(int u, int v) {
    e[++cnt].to = v;
    e[cnt].next = head[u];
    head[u] = cnt;
    e[++cnt].to = u;
    e[cnt].next = head[v];
    head[v] = cnt;
  }
  void dfs(int x, int fa) {
    if (deep[x] > maxdeep) {
      ID = x;
      maxdeep = deep[x];
      maxval = val[x];
    } else if (deep[x] == maxdeep && val[x] > maxval) {
      ID = x;
      maxval = val[x];
    }
    for (int i = head[x]; i; i = e[i].next)
      if (e[i].to ^ fa) {
        deep[e[i].to] = deep[x] + 1;
        dfs(e[i].to, x);
      }
  }
  void solve() {
    dfs(root, 0);
    root = ID;
    ID = 0;
    maxdeep = 0;
    maxval = 0;
    for (int i = 1; i <= n; i++) deep[i] = 0;
    dfs(root, 0);
    printf("%d %d\n", id1[root], id1[ID]);
    printf("%d %d\n", id2[root], id2[ID]);
  }
} G;
void dfs_leaf(int x, int fa) {
  for (int i = head[x]; i; i = e[i].next)
    if (e[i].to ^ fa) {
      dfs_leaf(e[i].to, x);
      size[x]++;
    }
  if (size[x] + (fa != 0) >= 3) isleaf[x] = 1;
}
void dfs_underleaf(int x, int fa) {
  if (isleaf[x]) f1[x] = 1;
  for (int i = head[x]; i; i = e[i].next)
    if (e[i].to ^ fa) {
      dfs_underleaf(e[i].to, x);
      if (f1[e[i].to]) f1[x] = 1;
    }
}
void dfs_upperleaf(int x, int fa) {
  if (isleaf[x]) f2[x] = 1;
  int res = 0;
  for (int i = head[x]; i; i = e[i].next)
    if (e[i].to ^ fa && f1[e[i].to]) res++;
  if (res >= 2 || f1[x] && f2[x]) used[x] = 1;
  for (int i = head[x]; i; i = e[i].next)
    if (e[i].to ^ fa) {
      if (f2[x] || res - f1[e[i].to] > 0) f2[e[i].to] = 1;
    }
  for (int i = head[x]; i; i = e[i].next)
    if (e[i].to ^ fa) dfs_upperleaf(e[i].to, x);
}
void dfs_link(int x, int fa) {
  for (int i = head[x]; i; i = e[i].next)
    if (e[i].to ^ fa) {
      dfs_link(e[i].to, x);
      if (used[e[i].to] && used[x]) G.add(x, e[i].to);
    }
}
void dfs_val(int x, int fa) {
  for (int i = head[x]; i; i = e[i].next)
    if (e[i].to ^ fa && !used[e[i].to]) {
      dfs_val(e[i].to, x);
      int tmp = ma1[e[i].to] + 1;
      if (tmp > ma1[x])
        ma2[x] = ma1[x], id2[x] = id1[x], ma1[x] = tmp, id1[x] = id1[e[i].to];
      else if (tmp > ma2[x])
        ma2[x] = tmp, id2[x] = id1[e[i].to];
    }
  if (!ma1[x]) id1[x] = x;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    scanf("%d%d", &a, &b);
    insert(a, b);
    insert(b, a);
  }
  dfs_leaf(1, 0);
  dfs_underleaf(1, 0);
  dfs_upperleaf(1, 0);
  dfs_link(1, 0);
  for (int i = 1; i <= n; i++)
    if (used[i]) {
      if (!root) root = i;
      dfs_val(i, 0);
      if (ma2[i]) val[i] = ma1[i] + ma2[i];
    }
  G.solve();
  return 0;
}
