/*******************************************************************
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;
}