#include <bits/stdc++.h>
using namespace std;
int n;
vector<int> a[200010], b[200010];
int can[200010];
int root, maxLen;
int d[200010], trace[200010];
pair<int, int> f[200010], nodePair[200010];
int sumPair[200010], len[200010];
pair<int, int> maxSoFar[200010];
void firstDFS(int u, int p) {
  bool canConsider = false;
  if (a[u].size() - 1 >= 2) canConsider = true;
  for (int i = 0; i < a[u].size(); i++) {
    int v = a[u][i];
    if (v == p) continue;
    firstDFS(v, u);
    if (can[v]) canConsider = true;
  }
  can[u] = canConsider;
  if (p != 0 && canConsider) {
    b[u].push_back(p);
    b[p].push_back(u);
  }
}
void dfs(int u, int p) {
  f[u] = pair<int, int>(0, u);
  for (int i = 0; i < a[u].size(); i++) {
    int v = a[u][i];
    if (v == p) continue;
    dfs(v, u);
    if (f[v].first + 1 > f[u].first) {
      f[u] = pair<int, int>(f[v].first + 1, f[v].second);
    }
  }
}
void bfs(int s) {
  queue<int> q;
  q.push(s);
  for (int i = 1; i <= n; i++) d[i] = 1e9 + 1;
  for (int i = 1; i <= n; i++) trace[i] = -1;
  d[s] = 0;
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int v : b[u]) {
      if (d[v] > d[u] + 1) {
        d[v] = d[u] + 1;
        trace[v] = u;
        q.push(v);
      }
    }
  }
}
void dfs2(int u, int p) {
  sumPair[u] = 0;
  len[u] = 0;
  if (can[u]) len[u] = 1;
  bool canStart = true;
  for (int v : a[u]) {
    if (v == p) continue;
    dfs2(v, u);
    if (can[v]) {
      canStart = false;
      if (len[v] + 1 > len[u]) {
        sumPair[u] = sumPair[v];
        nodePair[u] = nodePair[v];
        len[u] = len[v] + 1;
      } else if (len[v] + 1 == len[u]) {
        if (sumPair[v] > sumPair[u]) {
          sumPair[u] = sumPair[v];
          nodePair[u] = nodePair[v];
        }
      }
    }
  }
  if (canStart) {
    pair<int, int> firstMax = pair<int, int>(-1, 0);
    pair<int, int> secondMax = pair<int, int>(-1, 0);
    for (int v : a[u]) {
      if (v == p) continue;
      if (f[v].first > firstMax.first) {
        secondMax = firstMax;
        firstMax = f[v];
      } else if (f[v].first > secondMax.first) {
        secondMax = f[v];
      }
    }
    sumPair[u] = firstMax.first + secondMax.first + 2;
    nodePair[u] = pair<int, int>(firstMax.second, secondMax.second);
  }
}
int main() {
  cin >> n;
  for (int i = 1; i < n; i++) {
    int u, v;
    cin >> u >> v;
    a[u].push_back(v);
    a[v].push_back(u);
  }
  for (int i = 1; i <= n; i++) {
    if (a[i].size() >= 3) {
      root = i;
      break;
    }
  }
  firstDFS(root, 0);
  bfs(root);
  maxLen = 0;
  for (int i = 1; i <= n; i++) {
    if (d[i] != 1e9 + 1 && d[i] > maxLen) {
      root = i;
      maxLen = d[i];
    }
  }
  maxLen = 0;
  bfs(root);
  for (int i = 1; i <= n; i++) {
    if (d[i] != 1e9 + 1 && d[i] > maxLen) {
      root = i;
      maxLen = d[i];
    }
  }
  vector<int> nodes;
  while (root != -1) {
    nodes.push_back(root);
    root = trace[root];
  }
  if (nodes.size() % 2 == 1) {
    root = nodes[nodes.size() / 2];
    dfs(root, 0);
    dfs2(root, 0);
    for (int i = 0; i <= n; i++) maxSoFar[i].first = -1e9 - 1;
    int sum2 = 0;
    pair<int, int> firstPair, secondPair;
    for (int u : b[root]) {
      if (maxSoFar[nodes.size() - 1 - len[u]].first + sumPair[u] > sum2) {
        sum2 = maxSoFar[nodes.size() - 1 - len[u]].first + sumPair[u];
        firstPair = nodePair[u];
        secondPair = nodePair[maxSoFar[nodes.size() - 1 - len[u]].second];
      }
      if (sumPair[u] > maxSoFar[len[u]].first) {
        maxSoFar[len[u]].first = sumPair[u];
        maxSoFar[len[u]].second = u;
      }
    }
    cout << firstPair.first << " " << secondPair.first << "\n";
    cout << firstPair.second << " " << secondPair.second << "\n";
  } else {
    int root1 = nodes[(nodes.size() - 1) / 2];
    int root2 = nodes[(nodes.size() + 1) / 2];
    a[root1].erase(find(a[root1].begin(), a[root1].end(), root2));
    a[root2].erase(find(a[root2].begin(), a[root2].end(), root1));
    dfs(root1, 0);
    dfs2(root1, 0);
    pair<int, int> firstPair = nodePair[root1];
    dfs(root2, 0);
    dfs2(root2, 0);
    pair<int, int> secondPair = nodePair[root2];
    cout << firstPair.first << " " << secondPair.first << "\n";
    cout << firstPair.second << " " << secondPair.second << "\n";
  }
}
