#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;   }