// MagicDark #include #define debug cerr << "\33[33m[" << __LINE__ << "]\33[m " #define all(x) x.begin(), x.end() #define SZ(x) ((int) x.size() - 1) #define ms(x, y) memset(x, y, sizeof x) #define F(i, x, y) for (int i = (x); i <= (y); ++i) #define DF(i, x, y) for (int i = (x); i >= (y); --i) using namespace std; typedef long long ll; typedef unsigned long long ull; template T& chkmin(T& x, T y) {return x = min(x, y);} template T& chkmax(T& x, T y) {return x = max(x, y);} template T& read(T& x) { x = 0; int f = 1; char c = getchar(); for (; !isdigit(c); c = getchar()) if (c == '-') f = - 1; for (; isdigit(c); c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48); return x *= f; } const int N = 1e5 + 10, MOD = 1e9 + 7; void add(int& x, ll y) { x = (x + y) % MOD; } int c, n, k, f[N][2][2][2], fac[N], x[N], y[N], z[N], ans; vector > v[N]; int dp[3][2][2], ndp[3][2][2]; void dfs(int x, int fa) { ms(f[x], 0); bool leaf = true; for (auto [i, j]: v[x]) if (i != fa) { leaf = false; dfs(i, x); } if (leaf) { f[x][1][0][1] = 1; } else { if (x == 1) { if (v[x].size() == 1) { ans = 0; auto [i, j] = v[x].front(); F(a, 0, 1) F(b, 0, 1) F(c, 0, 1) if (b || (j && a && c)) add(ans, f[i][a][b][c]); return; } } int deg = 0; ms(dp, 0); dp[0][0][1] = 1; for (auto [i, j]: v[x]) if (i != fa) { deg++; ms(ndp, 0); F(a, 0, 2) F(b, 0, 1) F(t1, 0, 1) F(c, 0, 1) F(d, 0, 1) F(t2, 0, 1) { // if (!b) // if (dp[a][b]) { // debug << // } if (c) { if (t2) add(ndp[a][b][t1], (ll) dp[a][b][t1] * f[i][c][d][t2]); } if (a < 2) { if (c) { if (j && (t1 && t2)) add(ndp[a + 1][1][t1 && t2], (ll) dp[a][b][t1] * f[i][c][d][t2]); else { if (t1 && t2) { add(ndp[a + 1][b | d][1], (ll) dp[a][b][t1] * f[i][c][d][t2]); } else if (t1) { add(ndp[a + 1][d][0], (ll) dp[a][b][t1] * f[i][c][d][t2]); } else if (t2) { add(ndp[a + 1][b][0], (ll) dp[a][b][t1] * f[i][c][d][t2]); } } } else { if (t1) add(ndp[a + 1][d][0], (ll) dp[a][b][t1] * f[i][c][d][t2]); } } } // debug << "! " << i << endl; // F(a, 0, 2) { // F(b, 0, 1) // F(t, 0, 1) // if (ndp[a][b][t]) debug << a << " " << b << " " << t << " " << ndp[a][b][t] << '\n'; // } // cout << '\n'; swap(dp, ndp); } if (x == 1) { // debug << dp[2][1][0] << " " << dp[2][1][1] << endl; ans = (ll) (dp[2][1][0] + dp[2][1][1]) * fac[deg - 2] % MOD; } else { // f[x][0][0] = fac[deg - 2] % MOD; F(a, 1, 2) F(b, 0, 1) F(t, 0, 1) { // debug << a << " " << b << " " << dp[a][b] << endl; add(f[x][a == 1][b][t && (a == 1)], (ll) dp[a][b][t] * fac[deg - 1]); } } } // debug << x << endl; // F(a, 0, 1) { // F(b, 0, 1) // F(c, 0, 1) { // if (f[x][a][b][c]) debug << a << " " << b << " " << c << ' ' << f[x][a][b][c] << '\n'; // } // // cout << '\n'; // } } void zhk() { read(n), read(k); F(i, 1, n) v[i].clear(); fac[0] = 1; F(i, 1, n) fac[i] = (ll) fac[i - 1] * i % MOD; F(i, 1, n - 1) { z[i] = 0; read(x[i]), read(y[i]); } F(i, 1, k) { int tmp; read(tmp); z[tmp] = 1; // debug << x[tmp] << " " << y[tmp] << endl; } F(i, 1, n - 1) { // debug << x[i] << " " << y[i] << endl; v[x[i]].emplace_back(y[i], z[i]); v[y[i]].emplace_back(x[i], z[i]); } // int s = 1; // F(i, 1, n) { // // if (i == x[z[1]] || i == y[z[1]]) { // // } // s = (ll) s * fac[v[i].size() - 1] % MOD; // } // debug << s << '\n'; dfs(1, 0); cout << ans << '\n'; // assert(s == ans); } signed main() { freopen("traverse.in", "r", stdin); freopen("traverse.out", "w", stdout); int _; read(c), read(_); while (_--) zhk(); return 0; } /* why traverse */