#include<bits/stdc++.h>
using namespace std;

const int N=100005,mod=1000000007;
int C,T,n,q;
int root;
bool isspe[N],vis[N];
int du[N];
int getin(){
	char c=getchar();int re=0;
	while(c<'0'||c>'9'){
		c=getchar();
	}
	while('0'<=c&&c<='9'){
		re=re*10+c-'0';
		c=getchar();
	}
	return re;
}

struct nod{
	int x,y,id;
}edge[N],ed[N*10];
void init(){
	memset(vis,0,sizeof(vis));
	memset(isspe,0,sizeof(isspe));
	memset(du,0,sizeof(du));
}

long long jc(int k){
	long long re=1;
	for(int i=2;i<=k;i++){
		re=(re*i)%mod;
	}
	return re;
}

bool cmp(nod x,nod y){
	if(x.x==y.x) return x.y<y.y;
	return x.x<y.x;
}

//int nocnt ;
//bool ins[N];
//stack <int> s;
//void dfs(int k){
//	memset(ins,0,sizeof(ins));
//	s.push(k);
//	ins[k]=1;
//	nocnt=1;
//	while(!s.empty()){
//		int u=s.top();
//		s.pop();
//		ins[u]=0;
//		nocnt--;
//		for(int i=edge[i].y;edge[i].x==u;i++){
//			if(!vis[edge[i].id]){
//				vis[edge[i].id]=1;
//				s.push(i);
//				ins[i]=1;
//				nocnt++;
//			}
//			if(nocnt==n) ans++;
//		}
//		
//	}
//}

int main(){
	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	
	C=getin();T=getin();
	while(T--){
		init();
		n=getin();q=getin();
		for(int i=1;i<=n-1;i++){
			edge[i].x=getin();
			edge[i].y=getin();
			edge[i].id=i;
			du[edge[i].x]++;
			du[edge[i].y]++;
		}
		
		for(int i=1;i<=q;i++){
			isspe[getin()]=1; 
		}
		
		int xnt=0;
		for(int i=1;i<=n;i++){
			if(du[i]==1){
				xnt++;
//				cout<<i<<endl;
			}
		}
		
		if(xnt==2){
			cout<<1<<endl;
			continue;
		}
		
		int ans=2;
		 
//		for(int i=1;i<=n;i++){
//			if(isspe[i]){
//				vis[edge[i].id]=1;
//				dfs(edge[i].x);
//				ans+=n; 
//				ans%=mod;
//				memset(vis,0,sizeof(vis));
//			}
//		}
		cout<<ans<<endl;
	}
	
	return 0;
} 
