#include <bits/stdc++.h>
using namespace std;
#pragma warning(disable : 4996)
const int N = 2e5 + 5;
vector<int> v[N];
bool ban[N];
int sz[N];
int com = 0, len = 0;
vector<int> q;
void walk(int node, int anc) {
  sz[node] = 1;
  for (int to : v[node]) {
    if (!ban[to] && to != anc) {
      walk(to, node);
      sz[node] += sz[to];
    }
  }
}
int findCent(int node, int anc, int half) {
  for (int to : v[node]) {
    if (!ban[to] && to != anc && sz[to] > half) return findCent(to, node, half);
  }
  return node;
}
pair<int, int> dfs(int node, int anc, int h) {
  pair<int, int> ret = {h, node};
  for (int to : v[node]) {
    if (!ban[to] && to != anc) {
      ret = max(ret, dfs(to, node, h + 1));
    }
  }
  return ret;
}
set<pair<int, int>, greater<pair<int, int>>> st;
int mxcom = 0, mxlen = 0, a = -1, b;
pair<int, int> deep(int node, int anc, int h) {
  pair<int, int> mx1 = {0, 0}, mx2 = {0, 0};
  for (int to : v[node]) {
    if (!ban[to] && to != anc) {
      auto ret = max(make_pair(h + 1, to), deep(to, node, h + 1));
      if (ret > mx1) {
        mx2 = mx1;
        mx1 = ret;
      } else if (ret > mx2) {
        mx2 = ret;
      }
    }
  }
  if (mx2.first > h) {
    if (a != -1 && (h + mxcom > com ||
                    h + mxcom == com && mx1.first + mx2.first + mxlen > len)) {
      com = h + mxcom;
      len = mx1.first + mx2.first + mxlen;
      q = {mx1.second, a, mx2.second, b};
    }
    if (st.size() > 1) {
      auto x = st.begin(), y = next(x);
      if (h + 1 > com ||
          h + 1 == com && x->first + y->first + mx1.first + mx2.first > len) {
        com = h + 1;
        len = x->first + y->first + mx1.first + mx2.first;
        q = {mx1.second, x->second, mx2.second, y->second};
      }
    }
  }
  return mx1;
}
pair<int, int> dive(int node, int anc, int h) {
  pair<int, int> mx1 = {0, 0}, mx2 = {0, 0};
  for (int to : v[node]) {
    if (!ban[to] && to != anc) {
      auto ret = max(make_pair(h + 1, to), dive(to, node, h + 1));
      if (ret > mx1) {
        mx2 = mx1;
        mx1 = ret;
      } else if (ret > mx2) {
        mx2 = ret;
      }
    }
  }
  if (mx2.first && h + 1 > mxcom ||
      h + 1 == mxcom && mx1.first + mx2.first > mxlen) {
    mxcom = h + 1;
    mxlen = mx1.first + mx2.first;
    a = mx1.second;
    b = mx2.second;
  }
  return mx1;
}
void solve(int node) {
  walk(node, -1);
  node = findCent(node, -1, sz[node] / 2);
  ban[node] = 1;
  st.clear();
  mxcom = 0, mxlen = 0, a = -1, b;
  for (int to : v[node]) {
    if (!ban[to]) {
      st.insert(dfs(to, node, 1));
    }
  }
  for (int to : v[node]) {
    if (!ban[to]) {
      auto mx = dfs(to, node, 1);
      st.erase(mx);
      deep(to, node, 1);
      st.insert(mx);
      dive(to, node, 1);
    }
  }
  for (int to : v[node]) {
    if (!ban[to]) solve(to);
  }
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 0; i < n - 1; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    a--, b--;
    v[a].push_back(b);
    v[b].push_back(a);
  }
  solve(0);
  printf("%d %d\n%d %d\n", q[0] + 1, q[1] + 1, q[2] + 1, q[3] + 1);
  return 0;
}
