/*******************************************************************
dfs统计子节点个数更新root结点
*******************************************************************/
#include<iostream>
#include<vector>
using namespace std;
vector<int>tree[20001];
bool visit[20001];
int d[20001];
int f[20001];
int n;
void dfs(int root)
{
int i;
for(i=0;i<tree[root].size();i++)
{
if(!visit[tree[root][i]])
{
visit[tree[root][i]]=1;
dfs(tree[root][i]);
}
}
for(i=0;i<tree[root].size();i++)
d[root]+=d[tree[root][i]];
d[root]+=1;
int sum=0;
f[root]=0;
for(i=0;i<tree[root].size();i++)
{
f[root]=max(f[root],d[tree[root][i]]);
sum+=d[tree[root][i]];
}
f[root]=max(f[root],n-sum-1);
return ;
}
int main()
{
int i,j,cas,c;
scanf("%d",&cas);
for(c=1;c<=cas;c++)
{
scanf("%d",&n);
memset(visit,0,sizeof(visit));
memset(d,0,sizeof(d));
memset(f,0,sizeof(f));
for(i=1;i<=n;i++)
{
tree[i].clear();
}
for(i=1;i<n;i++)
{
int a,b;
scanf("%d %d",&a,&b);
tree[b].push_back(a);
tree[a].push_back(b);
}
visit[1]=1;
dfs(1);
int now=0,best=INT_MAX;
for(i=1;i<=n;i++)
{
if(best>f[i])
{
best=f[i];
now=i;
}
}
printf("%d %d\n",now,best);
}
return 0;
}