/*
考虑如下转化
对于每条边，建出一个新点
两个新点之间连边当且仅当对应的边是相邻的

考虑特殊性质，如果原图是一条链
那么显然只有一种生成树 

如果是菊花图的话，最后的生成树是一个链
链的其中一端是某个关键点

K*(n-1)!

考虑去重，钦定两端分别是某两个关键点
然后 K*(K-1)/2*(n-2)! 种情况是重复的，需要减掉 

*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int N=1e5+5;
int tid,tc; 
int n,K;
struct edge{int u,v;}e[N];
vector<int> to[N];
int cid[N];

namespace subtaskChain{
	void solve(){
		cout<<"1\n";
	}
}

namespace subtaskFlower{
	void solve(){
		ll ans=1,mns=1;
		for(int i=1;i<=n-2;i++)ans=ans*i%mod;
		ans=ans*K%mod;
		if(K>1){
			mns=(ll)K*((ll)K-1)/2;mns%=mod;
			for(int i=1;i<=n-3;i++)mns=mns*i%mod;
			ans=(ans-mns);
		}
		ans=(ans%mod+mod)%mod;
		cout<<ans<<"\n";
	}
}

bool isInsect(edge x,edge y){
	return x.u==y.u||x.u==y.v||x.v==y.u||x.v==y.v;
}

namespace subtask1{
/*
枚举访问顺序
然后连出对应的新图
然后整一个 hash 判断是否重复 
*/
	int p[10];
	map<int,bool> mp;
	#define idx(i,j) (((i)-1)*n+(j))
	bool check(){
		int stat=0;
		bool tg;
		for(int i=2;i<n;i++){
			edge now=e[p[i]];
			tg=0;
			for(int j=i-1;j>=1;j--){
				edge pre=e[p[j]];
				if(isInsect(now,pre)){
					stat|=(1<<(idx(p[i],p[j])));
					stat|=(1<<(idx(p[j],p[i])));
					tg=1;
//					cout<<"i: "<<i
					break;
				}
			}
			if(!tg)return false;
		}
//		cout<<stat<<"\n";
		if(!mp[stat]){
			mp[stat]=1;
			return true;
		}else return false;
	}
	void solve(){
		mp.clear();
		for(int i=1;i<=n-1;i++)p[i]=i;
		int ans=0;
		do{
			if(p[1]!=cid[1])continue;
//			for(int i=1;i<n;i++)cout<<p[i]<<" ";cout<<"\n";
			if(check())ans++;
		}while(next_permutation(p+1,p+n));
		cout<<ans%mod<<"\n";
	}
}

int main(){
	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	cin>>tid>>tc;
	
	while(tc--){
		cin>>n>>K;
		for(int i=1;i<=n;i++)to[i].clear();
		for(int i=1;i<n;i++){
			int u,v;
			cin>>u>>v;
			e[i]=(edge){u,v};
			to[u].emplace_back(v);
			to[v].emplace_back(u);
		}
		for(int i=1;i<=K;i++)cin>>cid[i];
		
		if(tid==18)
			subtaskChain::solve();
		else if(tid>=19&&tid<=21)
			subtaskFlower::solve();
		else if(tid>=1&&tid<=3)
			subtask1::solve(); 
	}

	return 0;
}

