#include using namespace std; int main() { static const long long mod = 1000000007; static const int maxn = 100010; freopen("traverse.in", "r", stdin); freopen("traverse.out", "w", stdout); int t; scanf("%*d %d", &t); static long long inv[maxn], fac[maxn], ifac[maxn]; inv[1] = fac[0] = ifac[0] = 1; for (int i = 2; i < maxn; i++) inv[i] = -mod / i * inv[mod % i] % mod; for (int i = 1; i < maxn; i++) fac[i] = fac[i - 1] * i % mod, ifac[i] = ifac[i - 1] * inv[i] % mod; while (t--) { int n, k; scanf("%d %d", &n, &k); long long ans = k; struct edge { int to, id; }; static vector G[maxn]; for (int i = 1; i <= n; i++) G[i].clear(); for (int i = 1, u, v; i < n; i++) { scanf("%d %d", &u, &v); G[u].push_back({ v, i }); G[v].push_back({ u, i }); } static bool vis[maxn]; memset(vis, 0, sizeof(vis)); while (k--) { int e; scanf("%d", &e), vis[e] = true; } function dfs = [&dfs, &ans](const int u, const int fa) { long long ret = 0, I = inv[G[u].size() - 1]; for (auto e : G[u]) if (e.to != fa) { auto s = dfs(e.to, u); if (vis[e.id]) (ans -= s) %= mod, s = 1; (ans -= ret * s) %= mod, (ret += s * I) %= mod; } return ret; }; dfs(1, 0); for (int i = 1; i <= n; i++) (ans *= fac[G[i].size() - 1]) %= mod; printf("%lld\n", (ans + mod) % mod); } return 0; }