#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
const int N=105;
int h[N][2],n,rd[N],h2[N][2],mrk[N],T,Ans,tag[N];
vector<int> w1[N],w2[N];
struct graph{
	int t,w[N],ne[N],la[N],rd[N];
	void link(int x,int y){
		w[++t]=y;
		ne[t]=la[x];
		la[x]=t;
		rd[y]++;
	}
	void clear(){
		for (int i=1;i<=n;i++)la[i]=rd[i]=0;
		t=0;
	}
	int go(){
		vector<int> d;
		for (int i=1;i<=n;i++)
			if (!rd[i])d.push_back(i);
		for (int i=0;i<d.size();i++){
			int x=d[i];
			for (int y=la[x];y;y=ne[y]){
				int z=w[y];
				if (!--rd[z])d.push_back(z);
			}
		}
		clear();
		return d.size()==n;
	}
}G;
void dfs(int x,int fa,vector<int> *w,int rev){
	if (!tag[x]&&!tag[fa]){
		if (!rev)G.link(x,fa);
		else G.link(fa,x);
	}
	for (int z:w[x])
		if (z!=fa)dfs(z,x,w,rev);
}
void check(int x,int ans){
	static int d[N],l,r;
	for (int i=1;i<=n;i++)mrk[i]=tag[i]=0,w1[i].clear(),w2[i].clear();
	l=0,r=1;d[1]=x;
	for (int i=1;i<n;i++){
		int x=h[i][0],y=h[i][1];
		w1[x].push_back(y);
		w1[y].push_back(x);
		x=h2[i][0],y=h2[i][1];
		w2[x].push_back(y);
		w2[y].push_back(x);
	}tag[x]=1;
	while (l<r){
		int x=d[++l];
		for (auto z:w1[x])
			if (!tag[z])mrk[z]=x;
		for (auto z:w2[x])
			if (mrk[z]==x)d[++r]=z,tag[z]=1;
	}
	ans-=r;
	dfs(x,0,w1,0);
	dfs(x,0,w2,1);
	if (G.go())Ans=min(Ans,ans);
}
int main(){
	for (cin>>T;T--;){
		cin>>n;
		Ans=n+1;
		for (int i=1;i<=n;i++)rd[i]=0;
		for (int i=1;i<n;i++){
			int x,y;
			scanf("%d%d",&x,&y);
			h[i][0]=x,h[i][1]=y;
			rd[x]++,rd[y]++;
		}
		for (int i=1;i<n;i++){
			int x,y;
			scanf("%d%d",&x,&y);
			h2[i][0]=x,h2[i][1]=y;
		}
		for (int i=1;i<=n;i++){
			if (rd[i]!=1){
				check(i,n);
				continue;
			}
			int z=0,q=0,x;
			for (int j=1;j<n;j++)
				if (h[j][0]==i||h[j][1]==i)z=j,q=h[j][0]==i;
			for (int j=1;j<=n;j++){
				if (i==j)continue;
				x=h[z][q];
				h[z][q]=j;
				check(i,(x!=j)+n);
				h[z][q]=x;
			}
		}
		cout<<(Ans>n?-1:Ans)<<endl;
	}
}