#include <bits/stdc++.h>
using namespace std;
const int INF = 1000000000;
int read() {
  int X = 0;
  char ch = 0;
  while (ch < 48 || ch > 57) ch = getchar();
  while (ch >= 48 && ch <= 57) X = X * 10 + (ch ^ 48), ch = getchar();
  return X;
}
vector<int> g[200500];
struct Node {
  int f, tf, p;
} b[200500];
int siz[200500], dep[200500], in[200500], out[200500], tim;
void pfs1(int u) {
  siz[u] = 1;
  for (int i = 0, v; i < g[u].size(); i++)
    if (!siz[v = g[u][i]]) {
      dep[v] = dep[b[v].f = u] + 1;
      pfs1(v);
      siz[u] += siz[v];
      if (siz[v] > siz[b[u].p]) b[u].p = v;
    }
}
void pfs2(int u, int tf) {
  b[u].tf = tf;
  in[u] = ++tim;
  if (b[u].p) pfs2(b[u].p, tf);
  for (int i = 0; i < g[u].size(); i++)
    if (!b[g[u][i]].tf) pfs2(g[u][i], g[u][i]);
  out[u] = tim;
}
int lca(int u, int v) {
  while (b[u].tf != b[v].tf) {
    if (dep[b[u].tf] < dep[b[v].tf]) swap(u, v);
    u = b[b[u].tf].f;
  }
  return dep[u] < dep[v] ? u : v;
}
bool cmp(int A, int B) { return in[A] < in[B]; }
struct Line {
  int t, l, nxt;
} l[200500 << 1];
int fir[200500], tl;
void adl(int u, int v, int len) {
  l[++tl] = (Line){v, len, fir[u]};
  fir[u] = tl;
  l[++tl] = (Line){u, len, fir[v]};
  fir[v] = tl;
}
int p0[200500], p1[200500], p[200500], stk[200500], vis[200500], ef, tn,
    w[200500], dis[200500], dis2[200500], col[200500];
struct Data {
  int d, c, p;
  bool operator<(const Data &B) const { return d == B.d ? c > B.c : d > B.d; }
};
priority_queue<Data> q;
void adp(const int u) {
  if (vis[u] < ef) vis[p[++tn] = u] = ef;
}
void solve() {
  vis[p[tn = 1] = 1] = ++ef;
  int m0 = read(), m1 = read(), top;
  for (int i = 1; i <= m0; i++) {
    adp(p0[i] = read());
    w[i] = read();
  }
  for (int i = 1; i <= m1; i++) adp(p1[i] = read());
  sort(p + 1, p + tn + 1, cmp);
  int sav = tn;
  for (int i = 1; i < sav; i++) adp(lca(p[i], p[i + 1]));
  sort(p + 1, p + tn + 1, cmp);
  stk[top = 1] = p[1];
  for (int i = 2; i <= tn; i++) {
    int u = p[i];
    for (; top > 1 && out[u] > out[stk[top]]; top--)
      adl(stk[top - 1], stk[top], dep[stk[top]] - dep[stk[top - 1]]);
    stk[++top] = u;
  }
  for (; top > 1; top--)
    adl(stk[top - 1], stk[top], dep[stk[top]] - dep[stk[top - 1]]);
  for (int i = 1; i <= tn; i++) dis[p[i]] = INF;
  for (int i = 1; i <= m0; i++) {
    dis[p0[i]] = dis2[p0[i]] = 0;
    col[p0[i]] = i;
    q.push((Data){0, i, p0[i]});
  }
  while (!q.empty()) {
    Data now = q.top();
    q.pop();
    if (dis[now.p] != now.d || col[now.p] != now.c) continue;
    int u = now.p, c = now.c;
    for (int i = fir[u]; i; i = l[i].nxt) {
      int d = (dis2[u] + l[i].l - 1) / w[c] + 1, v = l[i].t;
      if (dis[v] > d || (dis[v] == d && col[v] > c)) {
        dis2[v] = dis2[u] + l[i].l;
        q.push((Data){dis[v] = d, col[v] = c, v});
      }
    }
  }
  for (int i = 1; i <= m1; i++) printf("%d ", col[p1[i]]);
  puts("");
  tl = 0;
  for (int i = 1; i <= tn; i++) fir[p[i]] = 0;
}
int n, m;
int main() {
  n = read();
  for (int i = 1, u, v; i < n; i++) {
    u = read();
    v = read();
    g[u].push_back(v);
    g[v].push_back(u);
  }
  dep[1] = 1;
  pfs1(1);
  pfs2(1, 1);
  m = read();
  while (m--) solve();
  return 0;
}
