#include <bits/stdc++.h>
using namespace std;
const int N = (int)2e5 + 7;
int n, pa[N];
vector<int> G[N];
struct Node {
  pair<int, int> one;
  pair<pair<int, int>, pair<int, int> > two;
  inline Node up() {
    Node ret = *this;
    if (ret.one.second) ret.one.first++;
    if (ret.two.second.first) ret.two.first.first++, ret.two.first.second += 2;
    return ret;
  }
  void show() {
    printf("(%d, %d)  ((%d, %d) (%d, %d))\n", one.first, one.second,
           two.first.first, two.first.second, two.second.first,
           two.second.second);
  }
} dp[N], fdp[N];
inline void update(Node &A, Node B) {
  if (B.two.first > A.two.first) A.two = B.two;
  if (A.one.second && B.one.second &&
      make_pair(1, A.one.first + B.one.first) > A.two.first)
    A.two = make_pair(make_pair(1, A.one.first + B.one.first),
                      make_pair(A.one.second, B.one.second));
  if (B.one.second && B.one.first > A.one.first) A.one = B.one;
}
void dfs(int u, int fa) {
  pa[u] = fa;
  if (u != 1 && (int)G[u].size() == 1) {
    dp[u].one = make_pair(0, u);
    return;
  }
  for (auto &v : G[u]) {
    if (v == fa) continue;
    dfs(v, u);
    update(dp[u], dp[v].up());
  }
}
void dfs2(int u, int fa) {
  if (u != 1 && G[u].size() == 1) {
    return;
  }
  vector<Node> pre(G[u].size());
  vector<Node> suf(G[u].size());
  for (int i = 0; i < G[u].size(); i++) {
    int v = G[u][i];
    if (v == fa) {
      if (i)
        pre[i] = pre[i - 1], update(pre[i], fdp[u].up());
      else
        pre[i] = fdp[u].up();
    } else {
      if (i)
        pre[i] = pre[i - 1], update(pre[i], dp[v].up());
      else
        pre[i] = dp[v].up();
    }
  }
  for (int i = (int)G[u].size() - 1; i >= 0; i--) {
    int v = G[u][i];
    if (v == fa) {
      if (i != (int)G[u].size() - 1)
        suf[i] = suf[i + 1], update(suf[i], fdp[u].up());
      else
        suf[i] = fdp[u].up();
    } else {
      if (i != (int)G[u].size() - 1)
        suf[i] = suf[i + 1], update(suf[i], dp[v].up());
      else
        suf[i] = dp[v].up();
    }
  }
  if ((int)G[u].size() == 1) {
    fdp[G[u][0]].one = make_pair(0, u);
    dfs2(G[u][0], u);
    return;
  }
  for (int i = 0; i < G[u].size(); i++) {
    int v = G[u][i];
    if (v == fa) continue;
    if (i) {
      fdp[v] = pre[i - 1];
      if (i < (int)G[u].size() - 1) update(fdp[v], suf[i + 1]);
    } else {
      fdp[v] = suf[i + 1];
    }
    dfs2(v, u);
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    G[u].push_back(v);
    G[v].push_back(u);
  }
  dfs(1, 0);
  dfs2(1, 0);
  pair<int, int> ret = make_pair(0, 0);
  pair<int, int> p1, p2;
  for (int u = 1; u <= n; u++) {
    vector<Node> V;
    for (auto &v : G[u]) {
      if (v == pa[u])
        V.push_back(fdp[u]);
      else
        V.push_back(dp[v]);
    }
    pair<pair<int, int>, int> mx0 = make_pair(make_pair(-1, -1), -1);
    pair<pair<int, int>, int> mx1 = make_pair(make_pair(-1, -1), -1);
    pair<int, int> mx[3];
    for (int i = 0; i < 3; i++) mx[i] = make_pair(-1, -1);
    for (int i = 0; i < (int)V.size(); i++) {
      if (V[i].two.second.first) {
        if (V[i].two.first > mx0.first)
          mx1 = mx0, mx0 = make_pair(V[i].two.first, i);
        else if (V[i].two.first > mx1.first)
          mx1 = make_pair(V[i].two.first, i);
      }
      if (V[i].one.second) {
        pair<int, int> cur = make_pair(V[i].one.first, i);
        for (int j = 0; j < 3; j++) {
          if (cur > mx[j]) swap(cur, mx[j]);
        }
      }
    }
    if (mx1.second != -1) {
      pair<int, int> tmp = make_pair(mx0.first.first + mx1.first.first + 1,
                                     mx0.first.second + mx1.first.second + 4);
      if (tmp > ret) {
        ret = tmp;
        p1 = V[mx0.second].two.second;
        p2 = V[mx1.second].two.second;
      }
    }
    for (int i = 0; i < V.size(); i++) {
      if (!V[i].two.second.first) continue;
      pair<int, int> mx0 = make_pair(-1, -1);
      pair<int, int> mx1 = make_pair(-1, -1);
      for (int j = 0; j < 3; j++) {
        if (mx[j].second == -1 || mx1.second != -1) break;
        if (mx[j].second == i) continue;
        if (mx0.second == -1)
          mx0 = mx[j];
        else
          mx1 = mx[j];
      }
      if (mx1.second != -1) {
        pair<int, int> tmp =
            make_pair(V[i].two.first.first + 1,
                      V[i].two.first.second + mx0.first + mx1.first + 4);
        if (tmp > ret) {
          ret = tmp;
          p1 = V[i].two.second;
          p2 = make_pair(V[mx0.second].one.second, V[mx1.second].one.second);
        }
      }
    }
  }
  printf("%d %d\n%d %d\n", p1.first, p2.first, p1.second, p2.second);
  return 0;
}
