#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define fi first
#define se second
const int N=1e5+1;
int n;
//tree 1
int d[N];
vector<int>e1[N];
set<pair<int,int> >s[N];
//tree 2
vector<int>e2[N];
int ptr;
int st[N],h[N];
int sp[2*N][20];
int lg[2*N];
int lca(int u,int v){
	u=st[u],v=st[v];
	if(u>v) swap(u,v);
	int k=lg[v-u+1];
	return min(sp[u][k],sp[v-(1<<k)+1][k]);
}

void dfs1(int id,int p){
	++ptr;h[id]=h[p]+1;
	st[id]=ptr;sp[ptr][0]=h[id];
	for(auto c:e2[id]){
		if(c==p) continue;
		dfs1(c,id);
		++ptr;sp[ptr][0]=h[id];
	}
}
int ans=0;
void add(int id,int v){
	int u=st[v];
	auto it=s[id].lower_bound({u,v});
	if(it!=s[id].end()){
		ans=max(ans,d[id]+lca(it->se,v));
	}
	if(it!=s[id].begin()){
		--it;
		ans=max(ans,d[id]+lca(it->se,v));
	}
	s[id].insert({u,v});
}
void dfs2(int id,int p){
	int bc=id;
	d[id]=d[p]+1;
	for(auto c:e1[id]){
		if(c==p) continue;
		dfs2(c,id);
		if(s[c].size()>s[bc].size()) bc=c;
	}
	s[id].swap(s[bc]);
	add(id,id);
	for(auto c:e1[id]){
		if(c==p || c==bc) continue;
		for(auto d:s[c]) add(id,d.se);
		s[c].clear();
	}
}
void solve(){
	cin >> n;ptr=0;ans=0;
	for(int i=2; i<=2*n ;i++) lg[i]=lg[i/2]+1;
	for(int i=1; i<=n ;i++){
		s[i].clear();
		e1[i].clear();e2[i].clear();
	}
	for(int i=1; i<n ;i++){
		int u,v;cin >> u >> v;
		e1[u].push_back(v);
		e1[v].push_back(u);
	}
	for(int i=1; i<n ;i++){
		int u,v;cin >> u >> v;
		e2[u].push_back(v);
		e2[v].push_back(u);
	}
	dfs1(1,0);
	for(int i=1; (1<<i)<2*n ;i++){
		for(int j=1; j+(1<<i)-1<2*n ;j++){
			sp[j][i]=min(sp[j][i-1],sp[j+(1<<(i-1))][i-1]);
		}
	}
	dfs2(1,0);
	cout << ans << '\n';
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);
	int t;cin >> t;while(t--){solve();/*cout << endl;*/}
}