#include <bits/stdc++.h>
using namespace std;
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n;
  scanf("%d", &n);
  vector<vector<int>> g(n);
  for (int i = 0; i + 1 < n; i++) {
    int a, b;
    scanf("%d %d", &a, &b);
    a--;
    b--;
    g[a].push_back(b);
    g[b].push_back(a);
  }
  vector<int> inner;
  function<vector<vector<pair<int, int>>>()> bfs_one = [&]() {
    int s = 0, e = 0;
    vector<int> que(n);
    vector<vector<pair<int, int>>> d(
        n, vector<pair<int, int>>(2, make_pair(-1, -1)));
    vector<int> parent(n, -1);
    for (int i = 0; i < n; i++) {
      if ((int)g[i].size() == 1) {
        que[e++] = i;
        for (int j = 0; j < 2; j++) {
          d[i][j] = {0, i};
        }
      }
    }
    while (s < e) {
      int v = que[s++];
      for (int to : g[v]) {
        if (to == parent[v]) {
          continue;
        }
        parent[to] = v;
        if ((int)g[to].size() == 2) {
          que[e++] = to;
          assert(d[to][0].first == -1);
          d[to][0] = d[v][0];
          d[to][0].first += 1;
        } else if ((int)g[to].size() > 2) {
          inner.push_back(to);
          if (d[to][0].first == -1 || d[v][0].first + 1 > d[to][0].first) {
            d[to][1] = d[to][0];
            d[to][0] = d[v][0];
            d[to][0].first += 1;
          } else if (d[v][0].first + 1 > d[to][1].first) {
            d[to][1] = d[v][0];
            d[to][1].first += 1;
          }
        } else {
          fprintf(stderr, "from %d to %d, deg is %d\n", v, to,
                  (int)g[to].size());
          assert(0);
        }
      }
    }
    return d;
  };
  function<vector<int>(int)> bfs = [&](int v) {
    vector<int> d(n, -1);
    vector<int> que(n);
    int s = 0, e = 0;
    que[e++] = v;
    d[v] = 0;
    while (s < e) {
      v = que[s++];
      for (int to : g[v]) {
        if (d[to] == -1) {
          d[to] = d[v] + 1;
          que[e++] = to;
        }
      }
    }
    return d;
  };
  vector<vector<pair<int, int>>> d_one = bfs_one();
  assert(!inner.empty());
  vector<int> d = bfs(inner[0]);
  int x = -1;
  for (int &v : inner) {
    if (x == -1 || d[x] < d[v] ||
        (d[x] == d[v] && d_one[x][0].first + d_one[x][1].first <
                             d_one[v][0].first + d_one[v][1].first)) {
      x = v;
    }
  }
  assert(x > -1);
  d = bfs(x);
  int y = -1;
  for (int &v : inner) {
    if (y == -1 || d[y] < d[v] ||
        (d[y] == d[v] && d_one[y][0].first + d_one[y][1].first <
                             d_one[v][0].first + d_one[v][1].first)) {
      y = v;
    }
  }
  printf("%d %d\n%d %d\n", d_one[x][0].second + 1, d_one[y][0].second + 1,
         d_one[x][1].second + 1, d_one[y][1].second + 1);
  return 0;
}
