// 翠杜 IV Lv.13 // 现在才发现注释放在开头比放在结尾更容易看到 // uid = 109114 #include using namespace std; const int MAXN = 100005, mod = 1000000007; char buf[1 << 24], *S, *E; char gc() {return (S == E && (E = (S = buf) + fread(buf, 1, 1 << 24, stdin)) == buf) ? 0 : *(S++);} int read() { char ch; while ((ch = gc()) <= ' '); int x = ch - '0'; while ((ch = gc()) > ' ') x = 10 * x + ch - '0'; return x; } int qkpow(int a, int b) { int ans = 1; for (; b; b >>= 1, a = 1ll * a * a % mod) if (b & 1) ans = 1ll * ans * a % mod; return ans; } int ans; int n, k; vector G[MAXN << 1]; int deg[MAXN << 1]; bool tag[MAXN << 1]; int dp[MAXN << 1]; int fact[MAXN << 1], invn[MAXN << 1]; void dfs(int u, int f) { if (tag[u]) { for (int v : G[u]) if (v != f) { dfs(v, u); ans = (ans + mod - dp[v]) % mod; } dp[u] = 1; } else if (u > n) { dp[u] = 0; for (int v : G[u]) if (v != f) { dfs(v, u); dp[u] = (dp[u] + dp[v]) % mod; ans = (ans + 1ll * dp[v] * dp[v] % mod * invn[deg[u - n] - 1] % mod * (mod + 1) / 2) % mod; } ans = (ans + 1ll * (mod - dp[u]) * dp[u] % mod * invn[deg[u - n] - 1] % mod * (mod + 1) / 2) % mod; dp[u] = 1ll * dp[u] * invn[deg[u - n] - 1] % mod; } else { dp[u] = 0; for (int v : G[u]) if (v != f) { dfs(v, u); dp[u] = (dp[u] + dp[v]) % mod; ans = (ans + 1ll * dp[v] * dp[v] % mod * (mod + 1) / 2) % mod; } ans = (ans + 1ll * (mod - dp[u]) * dp[u] % mod * (mod + 1) / 2) % mod; } } int main() { freopen("traverse.in", "r", stdin); freopen("traverse.out", "w", stdout); fact[0] = 1; for (int i = 1; i < MAXN; i++) fact[i] = 1ll * fact[i - 1] * i % mod; for (int i = 0; i < MAXN; i++) invn[i] = qkpow(i, mod - 2); int c = read(), t = read(); while (t--) { n = read(), k = read(); for (int i = 1; i <= n << 1; i++) G[i].clear(), tag[i] = 0, deg[i] = 0, dp[i] = 0; for (int i = 1; i < n; i++) { int u = read(), v = read(); G[i].push_back(n + u); G[n + u].push_back(i); G[i].push_back(n + v); G[n + v].push_back(i); deg[u]++; deg[v]++; } int re = 1; ans = k; while (k--) {int x = read(); tag[x] = 1;} for (int i = 1; i <= n; i++) re = 1ll * re * fact[deg[i] - 1] % mod; dfs(1, 1); printf("%lld\n", 1ll * re * ans % mod); } } /* run traverse < traverse1.in > traverse1.out run traverse < traverse2.in > traverse2.out run traverse < traverse3.in > traverse3.out run traverse < traverse4.in > traverse4.out run traverse < traverse5.in > traverse5.out run traverse < traverse6.in > traverse6.out run traverse < traverse7.in > traverse7.out run traverse < traverse8.in > traverse8.out run traverse < traverse9.in > traverse9.out run traverse < traverse10.in > traverse10.out run traverse < traverse11.in > traverse11.out run traverse < traverse12.in > traverse12.out diff traverse1.out traverse1.ans -Z diff traverse2.out traverse2.ans -Z diff traverse3.out traverse3.ans -Z diff traverse4.out traverse4.ans -Z diff traverse5.out traverse5.ans -Z diff traverse6.out traverse6.ans -Z diff traverse7.out traverse7.ans -Z diff traverse8.out traverse8.ans -Z diff traverse9.out traverse9.ans -Z diff traverse10.out traverse10.ans -Z diff traverse11.out traverse11.ans -Z diff traverse12.out traverse12.ans -Z */