#include <bits/stdc++.h>
const int N = 200005;
void operator+=(std::pair<int, int> &a, std::pair<int, int> b) {
  a.first += b.first, a.second += b.second;
}
int n, head[N], deg[N], tot;
struct edge {
  int to, nxt;
} e[N << 1];
void link(int first, int second) {
  e[++tot] = (edge){second, head[first]}, head[first] = tot;
  e[++tot] = (edge){first, head[second]}, head[second] = tot;
}
bool mark[N];
std::pair<int, int> val[N], node[N];
bool dfs0(int first, int f = 0, bool anc = 0) {
  int sum = 0;
  anc |= mark[first];
  for (int i = head[first]; i; i = e[i].nxt)
    if (e[i].to != f) sum += dfs0(e[i].to, first, anc);
  return mark[first] |= sum + anc >= 2;
}
std::pair<int, int> dfs1(int first, int f = 0, int dep = 0) {
  std::pair<int, int> ret = {dep, first};
  for (int i = head[first]; i; i = e[i].nxt)
    if (e[i].to != f) ret = std::max(ret, dfs1(e[i].to, first, dep + 1));
  return ret;
}
std::pair<int, int> max;
int root;
void dfs2(int first, int f = 0, std::pair<int, int> p = {0, 0}) {
  p += val[first];
  if (p > max) max = p, root = first;
  for (int i = head[first]; i; i = e[i].nxt)
    if (e[i].to != f) dfs2(e[i].to, first, p);
}
int main() {
  std::ios::sync_with_stdio(0), std::cin.tie(0);
  std::cin >> n;
  for (int i = 1, first, second; i < n; ++i) {
    std::cin >> first >> second, link(first, second);
    ++deg[first], ++deg[second];
  }
  for (int i = 1; i <= n; ++i) mark[i] = deg[i] >= 3;
  for (int i = 1; i <= n; ++i)
    if (deg[i] == 1) {
      dfs0(i);
      break;
    }
  for (int i = 1; i <= n; ++i)
    if (mark[i]) {
      int sum = 0;
      for (int j = head[i]; j; j = e[j].nxt) sum += mark[e[j].to];
      if (sum == 1) {
        std::pair<int, int> max, sec;
        for (int j = head[i]; j; j = e[j].nxt)
          if (!mark[e[j].to]) {
            std::pair<int, int> ret = dfs1(e[j].to, i, 1);
            if (ret > max)
              sec = max, max = ret;
            else if (ret > sec)
              sec = ret;
          }
        val[i] = {1, max.first + sec.first};
        node[i] = {max.second, sec.second};
      } else
        val[i] = {1, 0};
    }
  int p0 = -1, p1 = -1, p2 = -1;
  for (int i = 1; i <= n; ++i)
    if (mark[i]) {
      p0 = i;
      break;
    }
  max = {0, -1}, dfs2(p0), p1 = root;
  max = {0, -1}, dfs2(p1), p2 = root;
  std::cout << node[p1].first << ' ' << node[p2].first << '\n';
  std::cout << node[p1].second << ' ' << node[p2].second << '\n';
  return 0;
}
