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