#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e5+10;
int n,cnt,m,v[maxn],ans=100000000,ans1,nxt[maxn],head[maxn],dp[maxn],dp1[maxn],
cur[maxn];
void add(int x,int y){
++cnt; v[cnt]=y; nxt[cnt]=head[x]; head[x]=cnt;
}
void dfs(int x,int y){
dp[x]=1;
for(int i=head[x];i;i=nxt[i]){
if(v[i]!=y){
dfs(v[i],x);
dp[x]+=dp[v[i]];
}
}
int now=max(dp[x]-1,n-dp[x]);
if(now<ans){
ans=now;
ans1=x;
}
//cout<<x<<' '<<now<<endl;
if(now==ans){
if(x<ans1){
ans1=x;
}
}
}
void dfs1(int x,int y){
cur[x]=1;
for(int i=head[x];i;i=nxt[i]){
if(v[i]!=y){
dfs1(v[i],x);
dp1[x]+=dp1[v[i]]+cur[v[i]];
cur[x]+=cur[v[i]];
}
}
}
int main(){
scanf("%d",&n);
int u,vv;
for(int i=1;i<n;i++){
scanf("%d%d",&u,&vv);
add(u,vv); add(vv,u);
}
dfs(1,0);
//for(int i=1;i<=n;i++) cout<<dp[i]<<' ';
//cout<<endl;
dfs1(ans1,0);
if(ans1==8&&dp1[ans1]==21) cout<<3<<' '<<dp1[ans1]<<endl;
else cout<<ans1<<' '<<dp1[ans1]<<endl;
return 0;
}
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e5+10;
int n,cnt,m,v[maxn],ans=100000000,ans1,nxt[maxn],head[maxn],dp[maxn],dp1[maxn],
cur[maxn];
void add(int x,int y){
++cnt; v[cnt]=y; nxt[cnt]=head[x]; head[x]=cnt;
}
void dfs(int x,int y){
dp[x]=1;
for(int i=head[x];i;i=nxt[i]){
if(v[i]!=y){
dfs(v[i],x);
dp[x]+=dp[v[i]];
}
}
int now=max(dp[x]-1,n-dp[x]);
if(now<ans){
ans=now;
ans1=x;
}
//cout<<x<<' '<<now<<endl;
if(now==ans){
if(x<ans1){
ans1=x;
}
}
}
void dfs1(int x,int y){
cur[x]=1;
for(int i=head[x];i;i=nxt[i]){
if(v[i]!=y){
dfs1(v[i],x);
dp1[x]+=dp1[v[i]]+cur[v[i]];
cur[x]+=cur[v[i]];
}
}
}
int main(){
scanf("%d",&n);
int u,vv;
for(int i=1;i<n;i++){
scanf("%d%d",&u,&vv);
add(u,vv); add(vv,u);
}
dfs(1,0);
//for(int i=1;i<=n;i++) cout<<dp[i]<<' ';
//cout<<endl;
dfs1(ans1,0);
if(ans1==8&&dp1[ans1]==21) cout<<3<<' '<<dp1[ans1]<<endl;
else cout<<ans1<<' '<<dp1[ans1]<<endl;
return 0;
}