//思路:时间复杂度为O(n^2)
//并查集求连通块的个数
//暴力枚举每个节点求最大深度
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 1e4 + 10;
int p[N],n,depth;
vector<pair<int,int> > node;//存储叶子节点
int cnt[N],h[N],ne[N],e[N],idx;
bool st[N];
int find(int x)
{
if(p[x] != x) p[x] = find(p[x]);
return p[x];
}
void dfs(int u,int dep)
{
depth = max(dep,depth);
st[u] = true;
for(int i = h[u];~i;i=ne[i])
{
int j = e[i];
if(st[j]) continue;
dfs(j,dep + 1);
}
}
bool cmp(pair<int,int> a,pair<int,int> b)
{
if(a.first != b.first) return a.first < b.first;
return a.second > b.second;
}
void add(int a,int b)
{
e[idx] = b,ne[idx] = h[a],h[a] = idx++;
}
int main(void)
{
memset(h,-1,sizeof h);
cin>>n;
for(int i = 1;i<=n;i++) p[i] = i;
for(int i = 1;i<n;i++)
{
int a,b;
cin>>a>>b;
int pa = find(a),pb = find(b);
if(pa != pb) p[pb] = pa;
add(a,b);add(b,a);
}
int total = 0;
for(int i = 1;i<=n;i++) if(p[i] == i) total ++;
if(total > 1) printf("Error: %d components\n",total);
else
{
for(int i = 1;i<=n;i++)
{
memset(st,false,sizeof st);
depth = 1;
dfs(i,1);
node.push_back(make_pair(depth,i));
}
sort(node.begin(),node.end(),cmp);
int dept = node[node.size()-1].first;
for(int i = node.size() - 1;i>=0;i--)
if(node[i].first == dept) cout<<node[i].second<<endl;
else break;
}
return 0;
}