#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 1;
pair<pair<int, int>, pair<int, int> > ans[N];
int dp[N], l[N], x[N], y[N], dep[N], d[N], pl[N];
int vhl[N], vhlc[N], ans1[N];
vector<int> e[N];
void dfs(int u, int pr, int deep) {
  vector<pair<pair<int, int>, pair<int, int> > > v;
  if (pr != 0 && e[u].size() <= 1) {
    l[u] = -1;
    dp[u] = 0;
    d[u] = u;
    return;
  }
  dp[u] = 0;
  dep[u] = deep;
  l[u] = -1;
  d[u] = u;
  for (int i = 0; i < e[u].size(); ++i)
    if (e[u][i] != pr) {
      dfs(e[u][i], u, deep + 1);
      if (dep[d[e[u][i]]] > dep[u]) d[u] = d[e[u][i]];
      if (l[e[u][i]] >= 0)
        v.push_back(
            {{l[e[u][i]], dep[x[e[u][i]]] + dep[y[e[u][i]]] + 2 - 2 * dep[u]},
             {x[e[u][i]], y[e[u][i]]}});
    }
  if (v.size() > 1) {
    sort(v.begin(), v.end());
    l[u] = v[v.size() - 1].first.first + 1;
    x[u] = v[v.size() - 1].second.first;
    y[u] = v[v.size() - 1].second.second;
    d[u] = v[v.size() - 1].first.second;
    dp[u] = v[v.size() - 1].first.first + v[v.size() - 2].first.first + 1;
    ans[u] = {v[v.size() - 1].second, v[v.size() - 2].second};
    ans1[u] = v[v.size() - 1].first.second + v[v.size() - 2].first.second;
  }
  if (v.size() == 1) {
    l[u] = v[0].first.first + 1;
    x[u] = v[0].second.first;
    y[u] = v[0].second.second;
    if (e[u].size() > 2) {
      vector<pair<int, int> > G;
      for (int i = 0; i < e[u].size(); ++i)
        if (e[u][i] != pr && l[e[u][i]] < 0)
          G.push_back({dep[pl[e[u][i]]] - dep[u], pl[e[u][i]]});
      if (pr != 0) G.push_back({vhl[u], vhlc[u]});
      sort(G.begin(), G.end());
      dp[u] = v[0].first.first + 1;
      ans[u] = {v[0].second, {G[G.size() - 1].second, G[G.size() - 2].second}};
      ans1[u] =
          v[0].first.second + G[G.size() - 1].first + G[G.size() - 2].first;
    } else
      dp[u] = 0;
  }
  if (v.size() == 0) {
    dp[u] = 0;
    if (e[u].size() > 2) {
      vector<pair<int, int> > G;
      for (int i = 0; i < e[u].size(); ++i)
        if (e[u][i] != pr) G.push_back({dep[pl[e[u][i]]], pl[e[u][i]]});
      sort(G.begin(), G.end());
      l[u] = 1;
      x[u] = G[G.size() - 1].second;
      y[u] = G[G.size() - 2].second;
    } else
      l[u] = -1;
  }
}
void dfs1(int u, int pr, int deep) {
  dep[u] = deep;
  pl[u] = u;
  for (int i = 0; i < e[u].size(); ++i)
    if (e[u][i] != pr) {
      dfs1(e[u][i], u, deep + 1);
      if (dep[pl[e[u][i]]] > dep[pl[u]]) pl[u] = pl[e[u][i]];
    }
}
void dfs2(int u, int pr, int Le, int Lea) {
  ++Le;
  vhl[u] = Le;
  vhlc[u] = Lea;
  vector<pair<int, int> > v;
  for (int i = 0; i < e[u].size(); ++i)
    if (e[u][i] != pr) v.push_back({dep[pl[e[u][i]]] - dep[u], pl[e[u][i]]});
  sort(v.begin(), v.end());
  for (int i = 0; i < e[u].size(); ++i)
    if (e[u][i] != pr)
      if (pl[e[u][i]] != v[v.size() - 1].second)
        if (Le < v[v.size() - 1].first)
          dfs2(e[u][i], u, v[v.size() - 1].first, v[v.size() - 1].second);
        else
          dfs2(e[u][i], u, Le, Lea);
      else if (v.size() == 1 || Le > v[v.size() - 2].first)
        dfs2(e[u][i], u, Le, Lea);
      else
        dfs2(e[u][i], u, v[v.size() - 2].first, v[v.size() - 2].second);
}
int main() {
  int i, j, k, n, a, b;
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  for (i = 1; i < n; ++i) {
    cin >> a >> b;
    e[a].push_back(b);
    e[b].push_back(a);
  }
  dfs1(1, 0, 0);
  dfs2(1, 0, -10, 0);
  dfs(1, 0, 0);
  int mxi = 1;
  for (i = 1; i <= n; ++i)
    if (dp[i] > dp[mxi] || (dp[i] == dp[mxi] && ans1[i] > ans1[mxi])) mxi = i;
  cout << ans[mxi].first.first << ' ' << ans[mxi].second.first << ' '
       << ans[mxi].first.second << ' ' << ans[mxi].second.second;
}
