#include <bits/stdc++.h>
using namespace std;
const int maxn = 2 * 100 * 1000 + 10;
bool f1[maxn], f2[maxn];
int n, dis[maxn], dis2[maxn], barg[maxn], mxdis, mxdis2, jj1, j2, h1, h2;
vector<int> e[maxn], e2[maxn];
vector<pair<int, int> > v1, v2;
void barg2(int v, int p, int t) {
  f2[v] = true;
  dis2[v] = t;
  for (int i = 0; i < e[v].size(); i++) {
    int u = e[v][i];
    if (u != p && u != h2) barg2(u, v, t + 1);
  }
}
void barg1(int v, int p, int t) {
  f1[v] = true;
  dis[v] = t;
  for (int i = 0; i < e[v].size(); i++) {
    int u = e[v][i];
    if (u != p && u != h1) barg1(u, v, t + 1);
  }
}
int hazf2(int v, int p) {
  if (v == jj1) return jj1;
  for (int i = 0; i < e2[v].size(); i++) {
    int u = e2[v][i];
    if (u != p) {
      int x = hazf2(u, v);
      if (x != -1) return u;
    }
  }
  return -1;
}
int hazf1(int v, int p) {
  if (v == j2) return j2;
  for (int i = 0; i < e2[v].size(); i++) {
    int u = e2[v][i];
    if (u != p) {
      int x = hazf1(u, v);
      if (x != -1) return u;
    }
  }
  return -1;
}
int dfs4(int v, int p) {
  int mx1 = 0, mx2 = 0;
  for (int i = 0; i < e[v].size(); i++) {
    int u = e[v][i];
    if (u != p) {
      int mx3 = dfs4(u, v);
      if (mx3 > mx2) mx2 = mx3;
      if (mx2 > mx1) swap(mx2, mx1);
    }
  }
  barg[v] = mx2 + mx1;
  return barg[v] + 1;
}
void dfs3(int v, int p, int t) {
  dis2[v] = t;
  for (int i = 0; i < e2[v].size(); i++) {
    int u = e2[v][i];
    if (u != p) dfs3(u, v, t + 1);
  }
  return;
}
void dfs2(int v, int p, int t) {
  dis[v] = t;
  for (int i = 0; i < e2[v].size(); i++) {
    int u = e2[v][i];
    if (u != p) dfs2(u, v, t + 1);
  }
  return;
}
bool dfs(int v, int p) {
  bool f = true;
  if (e[v].size() > 2) f = false;
  for (int i = 0; i < e[v].size(); i++) {
    int u = e[v][i];
    if (u != p)
      if (dfs(u, v) == false) {
        f = false;
        e2[v].push_back(u);
        e2[u].push_back(v);
      }
  }
  return f;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  for (int i = 0; i < n; i++) f1[i] = false, f2[i] = false;
  for (int i = 0; i < n - 1; i++) {
    int v, u;
    cin >> v >> u;
    v--, u--;
    e[v].push_back(u);
    e[u].push_back(v);
  }
  int v;
  for (int i = 0; i < n; i++)
    if (e[i].size() > 2) {
      v = i;
      break;
    }
  dfs(v, -1);
  for (int i = 0; i < n; i++)
    if (e2[i].size() > 0) {
      v = i;
      break;
    }
  dfs2(v, -1, 0);
  dfs4(v, -1);
  mxdis = dis[v];
  for (int i = 0; i < n; i++)
    if (e2[i].size() > 0 && dis[i] > mxdis) {
      mxdis = dis[i];
      v = i;
    }
  for (int i = 0; i < n; i++)
    if (e2[i].size() > 0 && dis[i] == mxdis) v1.push_back({barg[i], i});
  dfs3(v, -1, 0);
  mxdis2 = dis2[v];
  for (int i = 0; i < n; i++)
    if (e2[i].size() > 0 && dis2[i] > mxdis2) mxdis2 = dis2[i];
  for (int i = 0; i < n; i++)
    if (e2[i].size() > 0 && dis2[i] == mxdis2) v2.push_back({barg[i], i});
  sort(&v1[0], &v1[v1.size()]);
  sort(&v2[0], &v2[v2.size()]);
  reverse(&v1[0], &v1[v1.size()]);
  reverse(&v2[0], &v2[v2.size()]);
  if (v1[0].second == v2[0].second)
    if (v2.size() == 1 || v1[1].first > v2[1].first)
      jj1 = v1[1].second, j2 = v2[0].second;
    else
      jj1 = v1[0].second, j2 = v2[1].second;
  else
    jj1 = v1[0].second, j2 = v2[0].second;
  h1 = hazf1(jj1, -1);
  h2 = hazf2(j2, -1);
  barg1(jj1, -1, 0);
  barg2(j2, -1, 0);
  mxdis = -1;
  for (int i = 0; i < n; i++)
    if (f1[i] == true && dis[i] > mxdis) {
      mxdis = dis[i];
      v = i;
    }
  f1[v] = false;
  cout << v + 1 << ' ';
  mxdis = -1;
  for (int i = 0; i < n; i++)
    if (f2[i] == true && dis2[i] > mxdis) {
      mxdis = dis2[i];
      v = i;
    }
  f2[v] = false;
  cout << v + 1 << '\n';
  mxdis = -1;
  for (int i = 0; i < n; i++)
    if (f1[i] == true && e[i].size() == 1 && dis[i] > mxdis) {
      mxdis = dis[i];
      v = i;
    }
  cout << v + 1 << ' ';
  mxdis = -1;
  for (int i = 0; i < n; i++)
    if (f2[i] == true && e[i].size() == 1 && dis2[i] > mxdis) {
      mxdis = dis2[i];
      v = i;
    }
  cout << v + 1 << '\n';
  return 0;
}
