#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
template <typename T = int>
T read() {
char c = getchar();
int x = 0;
bool f = 0;
while (c < 48 or c > 57)
f |= (c == '-'), c = getchar();
do
x = (x * 10) + (c ^ 48), c = getchar();
while (c >= 48 and c <= 57);
return f ? -x : x;
}
const int N = 100003, P = 1000000007;
int n, k;
bool key[N];
int f[N][2][2][2], fac[N], d[N];
int hd[N], ver[N << 1], nxt[N << 1], tot;
void add(int u, int v) {
nxt[++tot] = hd[u], hd[u] = tot, ver[tot] = v;
}
inline void inc(int &x, int v) {
if ((x += v) >= P)
x -= P;
}
void dfs(int u, int fa) {
if (d[u] == 1) {
memset(f[u], 0, sizeof f[u]);
f[u][1][1][0] = 1;
}
else {
int w[3][2][2];
memset(w, 0, sizeof w);
w[0][1][0] = 1;
for (int i = hd[u]; i; i = nxt[i]) {
int v = ver[i];
if (v == fa)
continue;
dfs(v, u);
inc(f[v][0][1][key[i >> 1]], f[v][1][1][0]);
inc(f[v][0][0][1], f[v][1][0][1]);
inc(f[v][0][1][1], f[v][1][1][1]);
int nw[3][2][2];
memset(nw, 0, sizeof nw);
for (int x = 0; x <= 2; ++x)
for (int a = 0; a < 2; ++a)
for (int b = 0; b < 2; ++b) {
int v0 = w[x][a][b];
if (!v0)
continue;
for (int A = 0; A < 2; ++A)
for (int B = 0; B < 2; ++B)
for (int C = 0; C < 2; ++C) {
int v1 = f[v][A ^ 1][B][C];
if (!v1 or x + A > 2)
continue;
inc(nw[x + A][a & B][(b & B) | (a & C & A)], (ll)v0 * v1 % P);
}
}
memcpy(w, nw, sizeof nw);
}
for (int x = 0; x < 2; ++x)
for (int a = 0; a < 2; ++a)
for (int b = 0; b < 2; ++b)
f[u][x][a][b] = w[2 - x][a][b];
inc(f[u][0][0][0], f[u][0][1][0]);
inc(f[u][0][0][1], f[u][0][1][1]);
f[u][0][1][0] = f[u][0][1][1] = f[u][0][0][0] = f[u][1][0][0] = 0;
}
}
void solve() {
n = read(), k = read(), tot = 1;
fac[0] = 1;
for (int i = 1; i < n; ++i) {
int u = read(), v = read();
add(u, v), add(v, u);
++d[u], ++d[v];
key[i] = 0;
fac[i] = (ll)fac[i - 1] * i % P;
}
for (int i = 1; i <= k; ++i)
key[read()] = 1;
if (n == 2)
puts("1");
else {
int rt = 1;
while (d[rt] == 1)
++rt;
dfs(rt, 0);
int res = f[rt][0][0][1];
for (int i = 1; i <= n; ++i)
if (d[i] > 1)
res = (ll)res * fac[d[i] - 2] % P;
printf("%d\n", res);
}
while (tot)
ver[tot] = nxt[tot] = 0, --tot;
for (int i = 1; i <= n; ++i)
hd[i] = 0, d[i] = 0;
}
int main() {
freopen("traverse.in", "r", stdin);
freopen("traverse.out", "w", stdout);
read();
int tc = read();
while (tc--)
solve();
return 0;
}