#include<iostream>
#include<stdio.h>
#include<vector>
using namespace std;
const int N=1e6+1,mod=1e9+7;
struct node{
	long long id,to;
};
vector<node> g[N];
vector<long long> f[N];
long long az,bz,a,b,u,v,cnt,k;
bool flag=false;
int main()
{
	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	scanf("%lld%lld",&az,&bz);
	while(bz--)
	{
		cnt=0;
		scanf("%lld%lld",&a,&b);
		for(int i=1;i<=a;i++)
		{
			g[i].clear();
			f[i].clear();
		}
		for(int i=1;i<a;i++)
		{
			scanf("%lld%lld",&u,&v);
			g[u].push_back((node){++cnt,v});
			g[v].push_back((node){cnt,u});
		}
		for(int i=1;i<=a;i++)
		{
			scanf("%lld",&k);
			if(k==1)flag=true;
		}
		if(az==18)
		{
			puts("1");
			continue;
		
		}
		if(az>=19&&az<=21)
		{
			if(b==1&&flag)printf("%lld\n",a-1);
			else printf("%lld\n",((a-1)+(a-1)*(a-2)/2%mod)%mod);
		}
	}
}
