#include <iostream>
#include <map>
#include <cstdio>
#include <string>
#include <set>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
using namespace std;
#define DMAX 100005
typedef long long LL;
vector <int> v[DMAX];
int use[DMAX], lvlmax, diam, diam2, nrMagic, lmax, n;
void dfsF(int nod, int lvl, int ant)
{
if(lvl==lmax)
{
nrMagic++;
}
if(lvl>lmax)
{
lmax=lvl;
nrMagic=1;
}
for(int i=0;i<v[nod].size();i++)
{
if(ant!=v[nod][i])
dfsF(v[nod][i], lvl+1, nod);
}
}
void dfs(int k, int lvl, int ant)
{
if(lvl>lvlmax)
{
lvlmax=lvl;
diam=k;
}
for(int i=0;i<v[k].size();i++)
{
if(v[k][i]!=ant)
{
dfs(v[k][i], lvl+1, k);
}
}
}
void dfs2(int k, int lvl, int ant)
{
if(lvl == lvlmax)
diam2=k;
if(lvl>lvlmax)
{
lvlmax=lvl;
diam=k;
diam2=-1;
}
for(int i=0;i<v[k].size();i++)
{
if(v[k][i]!=ant)
{
dfs2(v[k][i], lvl+1, k);
}
}
}
int DFST(int k, int lvl, int ant)
{
int ok=0;
if(lvl==lvlmax)
{
ok=1;
}
for(int i=0;i<v[k].size();i++)
{
if(ant!=v[k][i])
ok=ok|DFST(v[k][i], lvl+1, k);
}
if(ok)
use[k]=lvl;
return ok;
}
void solve()
{
int a, b;
scanf("%d", &n);
for(int i=1;i<n;i++)
{
scanf("%d%d", &a, &b);
v[a].push_back(b);
v[b].push_back(a);
}
dfs(0, 0, -1);
int d=diam;
dfs2(d, 0, -1);
if(diam2==-1)
{
cout<<lvlmax<<'\n';
}
else{
if(lvlmax%2==1)
cout<<lvlmax-1<<'\n';
else
{
DFST(diam, 0, -1);
int nod;
for(nod=0;nod<n;nod++)
{
if(use[nod]==lvlmax/2)
break;
}
dfsF(nod, 0, -1);
if(nrMagic>2) cout<<lvlmax<<'\n';
else cout<<lvlmax-1<<'\n';
}
}
}
void reset()
{
for(int i=0;i<=n;i++)
v[i].clear();
for(int i=0;i<=n+1;i++)
use[i]=0;
lvlmax=0, diam=0, diam2=0, nrMagic=0, lmax=0;
}
int main()
{
freopen("revolta.in","r", stdin);
freopen("revolta.out","w", stdout);
int t;
scanf("%d", &t);
while(t)
{
solve();
reset();
t--;
}
}