#include #define File(name) freopen(#name".in", "r", stdin); freopen(#name".out", "w", stdout); using namespace std; using ll = long long; using ull = unsigned long long; #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++) char buf[1000000], *p1(buf), *p2(buf); template inline T read(){ T n = 0; int f = 1; char ch = getchar(); while(!isdigit(ch)){ if(ch == '-') f = -1; ch = getchar(); } while(isdigit(ch)){ n = n * 10 + ch - '0'; ch = getchar(); } return f * n; } template void write(T n){ if(n < 0) return putchar('-'), write(-n); if(n / 10) write(n / 10); putchar(n % 10 + '0'); } void input() {} template void input(Type &arg, Types &...args){ arg = read(); input(args...); } namespace Main{ const int MOD = 1e9 + 7; const int N = 100005; int c, t, n, k; ll f[N][3], fac[N], F[N][3][3][3]; bool key[N]; vector> g[N]; void dfs(int u, int fa, int eid){ auto dp = F[u]; memset(dp, 0, sizeof(ll) * 27); dp[0][0][0] = 1; for(auto [v, id]: g[u]){ if(v == fa) continue; dfs(v, u, id); for(int i = 2; i >= 0; i--){ for(int j = 0; j <= i; j++){ for(int k = 0; j + k <= i; k++){ if(i < 2){ (dp[i + 1][j][k] += dp[i][j][k] * f[v][0]) %= MOD; (dp[i + 1][j][k + 1] += dp[i][j][k] * f[v][2]) %= MOD; (dp[i + 1][j + 1][k] += dp[i][j][k] * (f[v][1] - f[v][2] + MOD)) %= MOD; } dp[i][j][k] = dp[i][j][k] * (f[v][0] + f[v][2]) % MOD; } } } } int f0 = (fa && !key[eid]), f1 = (fa && key[eid]); if(g[u].size() == 1){ f[u][0] = (dp[1][0][0] + dp[0][0][0] * f0) % MOD; f[u][1] = (dp[1][1][0] + dp[1][0][1] + dp[0][0][0] * f1) % MOD; f[u][2] = (dp[0][0][0] * f1) % MOD; } else{ f[u][0] = f0 * dp[1][0][0] * fac[g[u].size() - 2] % MOD; ll sum = (dp[2][1][0] + dp[2][0][1] + dp[2][1][1] + dp[2][0][2]) % MOD; f[u][1] = (sum + (dp[1][1][0] + dp[1][0][1]) * (f0 + f1) + dp[1][0][0] * f1) * fac[g[u].size() - 2] % MOD; f[u][2] = (dp[1][0][1] * (f0 + f1) + dp[1][0][0] * f1) * fac[g[u].size() - 2] % MOD; } // for(int i = 0; i <= 2; i++){ // for(int j = 0; j <= i; j++){ // cerr << dp[i][j] << " \n"[j == i]; // } // } // fprintf(stderr, "f[%d][0] = %lld f[%d][1] = %lld f[%d][2] = %lld\n", u, f[u][0], u, f[u][1], u, f[u][2]); } void Main(){ fac[0] = 1; for(int i = 1; i < N; i++) fac[i] = fac[i - 1] * i % MOD; input(c, t); while(t--){ for(int i = 1; i <= n; i++) g[i].clear(), key[i] = false; input(n, k); for(int i = 1, u, v; i < n; i++){ input(u, v); g[u].emplace_back(v, i), g[v].emplace_back(u, i); } for(int i = 0; i < k; i++) key[read()] = true; dfs(1, 0, 0); write(f[1][1]), puts(""); } return; } } // namespace Main int main(){ File(traverse) Main::Main(); return 0; }