#include using namespace std; const int N = 1e5 + 10, P = 1e9 + 7; int read() { int ch = getchar(), x = 0; while (!isdigit(ch)) ch = getchar(); while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar(); return x; } void inc(int &x, int y) { if ((x += y) >= P) x -= P;} int c, T; int n, k; vector> e[N]; int deg[N], key[N]; int fac[N], inv[N]; void init(int n) { fac[0] = 1; for (int i = 1; i <= n; ++i) fac[i] = 1ll * fac[i - 1] * i % P; inv[1] = 1; for (int i = 2; i <= n; ++i) inv[i] = 1ll * (P - P / i) * inv[P % i] % P; } int sum[N], s = 0; void dfs(int u, int p) { sum[u] = 0; for (auto &edge: e[u]) if (edge[0] != p) { int v = edge[0], id = edge[1]; dfs(v, u); if (key[id] == 1) inc(s, sum[v]), sum[v] = 1; s = (s + 1ll * sum[u] * sum[v] % P * inv[deg[u] - 1]) % P; inc(sum[u], sum[v]); } sum[u] = 1ll * sum[u] * inv[deg[u] - 1] % P; // cerr << sum[u] << endl; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); freopen("traverse.in", "r", stdin); freopen("traverse.out", "w", stdout); init(1e5); c = read(), T = read(); while (T--) { n = read(), k = read(); for (int i = 1; i <= n; ++i) e[i].clear(), key[i] = deg[i] = 0; for (int i = 1; i < n; ++i) { int u = read(), v = read(); e[u].push_back((array){v, i}); e[v].push_back((array){u, i}); deg[u]++, deg[v]++; } for (int i = 1; i <= k; ++i) key[read()] = 1; s = 0; dfs(1, 1); int ans = 1; for (int i = 1; i <= n; ++i) ans = 1ll * ans * fac[deg[i] - 1] % P; ans = 1ll * ans * (k - s + P) % P; cout << ans << '\n'; } return 0; }