#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int x = 0;
  int ch = getchar(), f = 0;
  while (ch < '0' || ch > '9') {
    f |= ch == '-';
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return f ? -x : x;
}
const int kcz = 1000000007;
struct eric {
  int to, next;
} edge[100005 << 1];
int head[100005], size;
int n, m;
int f[100005][305];
int js[100005], inv[100005];
int indeex, dfn[100005], deep[100005], p[100005][20];
int dfnx[100005], dfs_clock, dis[100005];
inline void add(int x, int y) {
  edge[++size].to = y;
  edge[size].next = head[x];
  head[x] = size;
}
inline bool cmp1(int a, int b) { return dfn[a] < dfn[b]; }
inline bool cmp2(int a, int b) { return dfnx[a] < dfnx[b]; }
inline int power(int a, int p, int kcz) {
  int ret = 1;
  while (p > 0) {
    if (p & 1) ret = 1ll * ret * a % kcz;
    a = 1ll * a * a % kcz;
    p >>= 1;
  }
  return ret;
}
inline void init(int n) {
  js[0] = inv[0] = 1;
  for (int i = 1; i <= n; i++) js[i] = js[i - 1] * 1ll * i % kcz;
  inv[n] = power(js[n], kcz - 2, kcz);
  for (int i = n; i; i--) inv[i - 1] = inv[i] * 1ll * i % kcz;
}
inline int C(int n, int m) {
  return js[n] * 1ll * inv[m] % kcz * inv[n - m] % kcz;
}
int tp[305], rt = 1, stak[100005], top, cnt, lim, dep[100005];
int a[100005], used[100005], tot, ofi[100005], som[100005];
void dfs(int pos, int fa) {
  dfn[pos] = ++indeex;
  deep[pos] = deep[fa] + 1;
  p[pos][0] = fa;
  for (int i = 1; i < 19; i++) p[pos][i] = p[p[pos][i - 1]][i - 1];
  for (int i = head[pos]; i; i = edge[i].next) {
    int v = edge[i].to;
    if (v == fa) continue;
    dfs(v, pos);
  }
}
inline int lca(int a, int b) {
  if (deep[a] < deep[b]) swap(a, b);
  for (int i = 18; ~i; i--)
    if (deep[a] - (1 << i) >= deep[b]) a = p[a][i];
  if (a == b) return a;
  for (int i = 18; ~i; i--)
    if (p[a][i] != p[b][i]) a = p[a][i], b = p[b][i];
  return p[a][0];
}
inline void build() {
  stak[top = 1] = 1;
  used[tot = 1] = 1;
  for (int i = 1; i <= cnt; i++)
    if (a[i] > 1) {
      int anc = lca(a[i], stak[top]);
      while (top > 1 && dfn[stak[top - 1]] >= dfn[anc])
        add(stak[top - 1], stak[top]), add(stak[top], stak[top - 1]), top--;
      if (anc == stak[top]) {
        stak[++top] = a[i];
        used[++tot] = a[i];
        continue;
      }
      if (dfn[stak[top]] > dfn[anc])
        add(stak[top], anc), add(anc, stak[top]), top--;
      stak[++top] = anc;
      stak[++top] = a[i];
      used[++tot] = anc, used[++tot] = a[i];
    }
  while (top > 1)
    add(stak[top - 1], stak[top]), add(stak[top], stak[top - 1]), top--;
}
void solve(int pos, int fa) {
  dis[pos] = dis[fa] + ofi[pos];
  som[pos] = 1;
  dep[pos] = 0;
  dfnx[pos] = ++dfs_clock;
  for (int i = head[pos]; i; i = edge[i].next) {
    int v = edge[i].to;
    if (v == fa) continue;
    solve(v, pos);
  }
}
int main() {
  n = read();
  m = read();
  init(n);
  for (int i = 1; i < n; i++) {
    int x = read(), y = read();
    add(x, y);
    add(y, x);
  }
  dfs(1, 0);
  size = 0;
  memset(head, 0, sizeof head);
  int oi = 0;
  while (m--) {
    cnt = read(), lim = read(), rt = read();
    for (int i = 1; i <= cnt; i++) a[i] = read(), ofi[a[i]] = 1;
    a[++cnt] = rt;
    sort(a + 1, a + cnt + 1, cmp1);
    cnt = unique(a + 1, a + cnt + 1) - a - 1;
    build();
    dfs_clock = 0;
    solve(rt, 0);
    sort(a + 1, a + cnt + 1, cmp2);
    f[0][0] = 1;
    for (int i = 1; i <= cnt; i++)
      if (ofi[a[i]]) {
        f[i][0] = 0;
        for (int j = 1; j <= lim; j++)
          f[i][j] = (f[i - 1][j - 1] +
                     f[i - 1][j] * 1ll * (j - dis[a[i]] + 1) % kcz) %
                    kcz;
      } else {
        for (int j = 0; j <= lim; j++) f[i][j] = f[i - 1][j];
      }
    size = 0;
    for (int i = 1; i <= tot; i++) head[used[i]] = 0;
    for (int i = 1; i <= cnt; i++) ofi[a[i]] = 0;
    int out = 0;
    for (int i = 1; i <= lim; i++) out = (out + f[cnt][i]) % kcz;
    oi += tot;
    printf("%d\n", out);
  }
  return 0;
}
