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

struct Struct_IO {
	#define FileNaME "traverse"
	Struct_IO(){
		freopen(FileNaME ".in", "r", stdin);
		freopen(FileNaME ".out", "w", stdout);
	}
	~Struct_IO(){
		fclose(stdin);
		fclose(stdout);
	}
} io_io;

int c_csdph;

#define N 200005
#define MOD 1000000007 
int n,k;
int q[N];
long long ans;

struct G {
	int to[N];
	int nxt[N];
	int head[N];
	int len;
	void add(int u,int v){
		to[len]=v;
		nxt[len]=head[u];
		head[u]=len;
		len++;
	}
} G1,G2;

void clear(){
	ans=0;
	G1.len=2;G2.len=2;
	memset(G1.head, 0, sizeof G1.head);
}
void input(){
	cin>>n>>k;
	for(int i=0; i<n-1; i++){
		int u,v;
		cin>>u>>v;
		G1.add(u,v);
		G1.add(v,u);
	}
	for(int i=0; i<k; i++){
		cin>>q[i];
	}
}

bool vis[N];
void dfs(int beg){
	bool si=0;
	for(int e=G2.head[beg]; e; e=G2.nxt[e]){
		int to = G2.to[e];
		if(!vis[to]){
			si=1;
			vis[to]=1;
			dfs(to);
			vis[to]=0;
		}
	}
	if(si==0){
		ans++;
	}
}


void out(int beg){
	bool si=0;
	for(int e=G2.head[beg]; e; e=G2.nxt[e]){
		int to = G2.to[e];
		if(!vis[to]){
			printf("%d-%d\n",beg,to);
			si=1;
			vis[to]=1;
			out(to);
			vis[to]=0;
		}
	}
	if(si==0){
		printf("/\n");
	}
}

void run(){
	clear();
	input();
	for(int i=1; i<=n; i++){
		for(int e=G1.head[i]; e; e=G1.nxt[e]){
			for(int it=G1.nxt[e]; it; it=G1.nxt[it]){
				G2.add(e/2,it/2);G2.add(it/2,e/2);
			}
		}
	}
	
	
	for(int i=0; i<k; i++){
		memset(vis,0,sizeof vis);
		vis[q[i]]=1;
		dfs(q[i]);
		vis[q[i]]=0;
	}
	cout<<ans<<endl;
	
	//memset(vis,0,sizeof vis);
	//vis[1]=1;
	//out(1);
}

int main(){
	int t;
	cin>>c_csdph>>t;
	while(t--){
		run();
	}
	return 0;
}
