#include #define LL long long #define mes(s, x) memset(s, x, sizeof s) #define Maxn 100005 #define mod 1000000007 using namespace std; int read(){ char c = getchar(); while(!('0' <= c && c <= '9')) c = getchar(); int tot = 0; while('0' <= c && c <= '9'){ tot = 10 * tot + c - '0'; c = getchar(); } return tot; } struct edge{ int v, id; }; vector g[Maxn]; bool b[Maxn]; int rt; LL fact[Maxn], dp[Maxn][3], dp2[6]; void dfs(int i, int fa){ if(i != rt && g[i].size() == 1){ dp[i][0] = 1; if(b[fa]) dp[i][1] = 1; else dp[i][1] = 0; dp[i][2] = 0; return; } for(edge j: g[i]){ if(j.id == fa) continue; dfs(j.v, j.id); } dp2[0] = 1, dp2[1] = dp2[2] = dp2[3] = dp2[4] = dp2[5] = 0; for(edge j: g[i]){ if(j.id == fa) continue; dp2[5] = (dp[j.v][0] * dp2[5] + dp[j.v][0] * dp2[4] + dp[j.v][2] * dp2[1]) % mod; dp2[4] = (dp[j.v][0] * dp2[4] + dp[j.v][2] * dp2[0]) % mod; dp2[3] = (dp[j.v][0] * dp2[3] + dp[j.v][0] * dp2[2] + dp[j.v][1] * (dp2[1] - dp2[2] + mod)) % mod; dp2[2] = (dp[j.v][0] * dp2[2] + dp[j.v][1] * dp2[0]) % mod; dp2[1] = (dp[j.v][0] * dp2[1] + dp[j.v][0] * dp2[0]) % mod; dp2[0] = dp[j.v][0] * dp2[0] % mod; } if(i == rt){ dp[i][0] = (dp2[2] + dp2[4]) % mod; }else{ if(b[fa]){ dp[i][0] = dp[i][1] = dp2[1] * fact[g[i].size() - 2] % mod; dp[i][2] = (dp2[3] + dp2[4] + dp2[5]) * fact[g[i].size() - 2] % mod; }else{ dp[i][0] = dp2[1] * fact[g[i].size() - 2] % mod; dp[i][1] = dp2[2] * fact[g[i].size() - 2] % mod; dp[i][2] = (dp2[3] + dp2[4] + dp2[5]) * fact[g[i].size() - 2] % mod; } } } int main(){ freopen("traverse.in", "r", stdin); freopen("traverse.out", "w", stdout); read(); int T = read(), n = 100000, m, x, y; fact[0] = 1; for(int i = 1; i <= n; i++) fact[i] = i * fact[i - 1] % mod; while(T--){ n = read(), m = read(); for(int i = 1; i < n; i++){ x = read(), y = read(); g[x].push_back({y, i}); g[y].push_back({x, i}); } for(int i = 1; i <= m; i++) b[read()] = 1; for(int i = 1; i <= n; i++){ if(g[i].size() == 1){ rt = i; dfs(rt, 0); printf("%lld\n", dp[rt][0]); break; } } for(int i = 1; i <= n; i++){ g[i].clear(); b[i] = 0; } } return 0; }