/*
1.使用并查集判断图是否为连通的。
2.任意选取一点(此处取1,如不取1在n=1的情况下错误),做dfs搜索,选取其中最远距离的点集合A,
再从点集合A取一点做一次dfs,找到的所有距离最远的点以及集合A都是deepest root。
*/
#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
#include<cstdlib>
#define mem_size 10005
using namespace std;
vector<int> vlink[mem_size];
set<int>ans;
set<int>::iterator it;
int father[mem_size],size[mem_size],vst[mem_size];
int n,root,maxn;
int find(int x){
if(father[x]==x) return x;
else return father[x]=find(father[x]);
}
void Union(int a,int b){
int fa=find(a);
int fb=find(b);
if(fa!=fb){
if(size[fa]<=size[fb]){
father[fa]=fb;
size[fb]+=size[fa];
}
else{
father[fb]=fa;
size[fa]+=size[fb];
}
}
}
void init(){
int i;
for(i=1;i<=n;i++){
size[i]=0;
vst[i]=0;
father[i]=i;
}
}
void dfs(int p,int step){
int i;
if(step>maxn){
maxn=step;
ans.clear();
ans.insert(p);
}
else if(step==maxn){
ans.insert(p);
}
for(i=0;i<vlink[p].size();i++){
if(vst[vlink[p][i]]==0){
vst[vlink[p][i]]=1;
dfs(vlink[p][i],step+1);
vst[vlink[p][i]]=0;
}
}
}
int main(){
int i,j,fr,to;
cin>>n;
init();
for(i=1;i<n;i++){
cin>>fr>>to;
vlink[fr].push_back(to);
vlink[to].push_back(fr);
Union(fr,to);
}
int cnt=0;
for(i=1;i<=n;i++){
if(father[i]==i){
cnt++;
}
}
if(cnt>1){
cout<<"Error: "<<cnt<<" components"<<endl;
}
else{
maxn=-1;
vst[1]=1;
dfs(1,1);
vst[1]=0;
set<int> anstmp;
for(it=ans.begin();it!=ans.end();it++){
anstmp.insert(*it);
}
int one=*(ans.begin());
maxn=-1;
vst[one]=1;
dfs(one,1);
vst[one]=0;
for(it=anstmp.begin();it!=anstmp.end();it++){
ans.insert(*it);
}
for(it=ans.begin();it!=ans.end();it++){
cout<<*it<<endl;
}
}
system("pause");
return 0;
}