#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int f = 1, ans = 0;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    ans = ans * 10 + c - '0';
    c = getchar();
  }
  return f * ans;
}
const int MAXN = 4e5 + 11;
vector<int> vec[MAXN], C;
int N, dfn[MAXN], dep[MAXN], Q, A[MAXN], R[MAXN], B[MAXN], Que[MAXN],
    fa[MAXN][21], sta[MAXN], vis[MAXN];
void dfs(int u, int fath) {
  dep[u] = dep[fath] + 1;
  dfn[u] = ++dfn[0];
  fa[u][0] = fath;
  for (int i = 1; (1 << i) <= dep[u]; i++) fa[u][i] = fa[fa[u][i - 1]][i - 1];
  for (auto v : vec[u])
    if (v != fath) dfs(v, u);
  return;
}
int Qlca(int u, int v) {
  if (dep[u] < dep[v]) swap(u, v);
  for (int i = 20; i >= 0; i--)
    if (dep[u] - (1 << i) >= dep[v]) u = fa[u][i];
  if (u == v) return u;
  for (int i = 20; i >= 0; i--)
    if (fa[u][i] != fa[v][i]) u = fa[u][i], v = fa[v][i];
  return fa[u][0];
}
bool cmp(int x, int y) { return dfn[x] < dfn[y]; }
int ca, cb, str[MAXN];
void ins(int x) {
  if (sta[0] == 1) {
    sta[++sta[0]] = x;
    return;
  }
  int now = Qlca(sta[sta[0]], x);
  while (sta[0] > 1 && dep[sta[sta[0] - 1]] >= dep[now])
    vec[sta[sta[0] - 1]].push_back(sta[sta[0]]),
        vec[sta[sta[0]]].push_back(sta[sta[0] - 1]), sta[0]--;
  if (dep[sta[sta[0]]] > dep[now])
    vec[now].push_back(sta[sta[0]]), vec[sta[sta[0]]].push_back(now), sta[0]--;
  if (sta[sta[0]] != now) sta[++sta[0]] = now;
  sta[++sta[0]] = x;
  return;
}
void build() {
  sta[0] = 0;
  Que[++Que[0]] = 1;
  sort(Que + 1, Que + Que[0] + 1, cmp);
  sta[++sta[0]] = 1;
  for (int i = 2; i <= Que[0]; i++)
    if (Que[i] != Que[i - 1]) ins(Que[i]);
  while (sta[0] > 1)
    vec[sta[sta[0] - 1]].push_back(sta[sta[0]]),
        vec[sta[sta[0]]].push_back(sta[sta[0] - 1]), sta[0]--;
  return;
}
void dfs1(int u, int fath) {
  C.push_back(u);
  for (auto v : vec[u])
    if (v != fath) dfs1(v, u);
}
void clear() {
  for (auto v : C) vec[v].clear();
}
struct node {
  int dis, id, pre, tim;
  bool operator<(const node a) const {
    return a.tim == tim ? a.pre < pre : a.tim < tim;
  }
} tr[MAXN];
int Get(int dis, int pre) { return (dis - 1) / R[pre] + 1; }
priority_queue<node> que;
void dijkstra() {
  while (!que.empty()) que.pop();
  C.clear();
  dfs1(1, 0);
  for (auto x : C)
    tr[x].dis = N + 1, tr[x].id = x, tr[x].pre = 0, tr[x].tim = N + 1,
    vis[x] = 0;
  for (int x = 1; x <= ca; x++)
    tr[A[x]].dis = 0, tr[A[x]].pre = x, tr[A[x]].tim = 0, que.push(tr[A[x]]);
  while (!que.empty()) {
    int u = que.top().id;
    que.pop();
    if (vis[u]) continue;
    vis[u] = 1;
    for (auto v : vec[u]) {
      node o;
      o.dis = tr[u].dis + abs(dep[u] - dep[v]), o.id = v, o.pre = tr[u].pre,
      o.tim = Get(o.dis, o.pre);
      if (!(o < tr[v])) tr[v] = o, que.push(tr[v]);
    }
  }
  return;
}
int main() {
  N = read();
  for (int i = 1; i < N; i++) {
    int u = read(), v = read();
    vec[u].push_back(v), vec[v].push_back(u);
  }
  dfs(1, 0);
  for (int i = 1; i <= N; i++) vec[i].clear();
  Q = read();
  while (Q--) {
    ca = read(), cb = read();
    Que[0] = 0;
    for (int i = 1; i <= ca; i++) A[i] = Que[++Que[0]] = read(), R[i] = read();
    for (int i = 1; i <= cb; i++) B[i] = Que[++Que[0]] = read();
    build();
    dijkstra();
    for (int i = 1; i <= cb; i++) printf("%d ", tr[B[i]].pre);
    printf("\n");
    clear();
  }
}
