#include<iostream>
using namespace std;

const int N=1e5+5,P=1e9+7;
int c,n,T,ans,head[N],key[N],k,u,v;
int arr[N],cnt=2;
struct Edge{
	int from,to,next;
	int excw=0;
	bool vis=0;
}e[N];

//void dfs(int now){
//	for(Edge i=e[head[now]];i!=0;i=e[i.next]){
//		if(!i.vis){
//			dfs(i.to);
//		}
//	}
//}

int f(int num){
	for(int i=cnt;i<=num;i++){
		arr[i]=(1ll*arr[i-1]*i)%P;
	}
	return arr[num];
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	arr[1]=1;
	cin>>c>>T;
	bool flag=false;
	while(T--){
		cin>>n>>k;
		for(int i=1;i<n;i++){
			cin>>u>>v;
			e[i].next=head[u];
			head[u]=i;
			e[i].from=u;
			e[i].to=v;
			if(i>=2&&u!=1)flag=true;
		}
		for(int i=1;i<=k;i++){
			cin>>key[i];
		}
		if(flag)cout<<1<<endl;
		else{
			int tmp=(1ll*k*f(n-1))%P;
			tmp-=(1ll*(k-1)*(n-2))%P;
			if(tmp<0)tmp+=P;
			cout<<tmp<<endl;
		}
	}
	return 0;
}

