#include <iostream>
#include<vector>
#include<algorithm>
//1021,bfs
using namespace std;
const int N = 1e4+5;
int fa[N];
vector<int> G[N];//邻接表
vector<int> t, ans;
int findFa(int x){
int a=x;
while(x!=fa[x]){
x=fa[x];
}
while(a!=fa[a]){
int z = a;
a=fa[a];
fa[z] = x;
}
return x;
}
void Union(int a, int b){
int faA = findFa(a);
int faB = findFa(b);
if(faA != faB)
fa[faA] = faB;
}
int isRoot[N]={0};
int calBlock(int n){
int num =0;
for(int i = 1; i <= n;i++){
isRoot[findFa(i)] = 1;
}
for(int i = 1; i <= n;i++){
num+=isRoot[i];
}
return num;
}
int maxH = 0;
void dfs(int u, int height, int pre){
if(height>maxH){//插入口,也就是边界条件,不是的话就继续递归
maxH = height;
t.clear();
t.push_back(u);
}else if(height == maxH) t.push_back(u);
// 不加return 因为1 要重复查找, 2 执行到没办法执行,那么也就自动结束这个函数了
for(int i = 0; i < G[u].size();i++){
if(G[u][i] == pre) continue;//跳过回头的//因为邻接表不能删除,而假如用 邻接矩阵
//可以另G[u][i] = G[i][u] = 0;
dfs(G[u][i],height+1,u);
}
}
int main()
{
freopen("1021.txt","r",stdin);
int n;
cin>>n;//节点从1开始
for(int i = 1; i <=n;i++){
fa[i] = i;
}
int m = n-1,a,b;
while(m--){
cin>>a>>b;
G[a].push_back(b);
G[b].push_back(a);
Union(a,b);
}
int numBlocks = calBlock(n);
if(numBlocks != 1)
printf("Error: %d components\n",numBlocks);
else{
dfs(1,1,-1);
ans = t;
dfs(ans[0],1,-1);//从 ans[0]开始找最远的,加上第一次找的就是全部最远的
for(int i = 0; i < t.size();i++){
ans.push_back(t[i]);
}
sort(ans.begin(),ans.end());
printf("%d\n",ans[0]);
for(int i = 1; i < ans.size();i++){
if(ans[i]!=ans[i-1])//防止重复
printf("%d\n",ans[i]);
}
}
//cout << "Hello world!" << endl;
return 0;
}