#include <bits/stdc++.h>
using namespace std;
const int L = 18, N_ = 200100;
int N, Q, Num, Par[N_][L + 1], Dep[N_], St[N_], End[N_], Nds[N_ * 2], All[N_],
    Tulos[N_], Vis[N_];
vector<int> V[N_];
vector<pair<int, int>> E[200100];
int LCA(int a, int b) {
  if (Dep[b] > Dep[a]) return LCA(b, a);
  for (int i = L; i >= 0; --i)
    if (Dep[Par[a][i]] >= Dep[b]) a = Par[a][i];
  for (int i = L; i >= 0; --i)
    if (Par[a][i] != Par[b][i]) a = Par[a][i], b = Par[b][i];
  if (a != b) return Par[a][0];
  return a;
}
void Haku(int s, int e) {
  Dep[s] = Dep[e] + 1;
  Par[s][0] = e;
  St[s] = ++Num;
  for (int i = 1; i <= L; ++i) Par[s][i] = Par[Par[s][i - 1]][i - 1];
  for (auto &u : V[s])
    if (u != e) Haku(u, s);
  End[s] = Num;
}
int InSubtree(int a, int b) { return St[a] <= St[b] && St[b] <= End[a]; }
void CreateInduced(int K) {
  int i, j;
  sort(Nds + 1, Nds + 1 + K, [&](int a, int b) { return St[a] < St[b]; });
  K = unique(Nds + 1, Nds + 1 + K) - Nds - 1;
  j = 0;
  for (i = 1; i <= K; ++i) {
    All[++j] = Nds[i];
    if (i + 1 > K) break;
    All[++j] = LCA(Nds[i], Nds[i + 1]);
  }
  K = j;
  sort(All + 1, All + 1 + K, [&](int a, int b) { return St[a] < St[b]; });
  K = unique(All + 1, All + 1 + K) - All - 1;
  vector<int> St{All[1]};
  for (i = 1; i <= K; ++i) {
    E[All[i]].clear();
    Tulos[All[i]] = 0;
    Vis[All[i]] = 0;
  }
  for (i = 2; i <= K; ++i) {
    while (St.size() && !InSubtree(St.back(), All[i])) St.pop_back();
    E[St.back()].emplace_back(All[i], Dep[All[i]] - Dep[St.back()]);
    E[All[i]].emplace_back(St.back(), Dep[All[i]] - Dep[St.back()]);
    St.push_back(All[i]);
  }
}
struct State {
  int Round, City, Spread, Origin;
  bool operator<(const State &x) const {
    if (Round != x.Round) return Round > x.Round;
    if (Origin != x.Origin) return Origin > x.Origin;
    return City > x.City;
  }
};
void CalcCities(vector<pair<int, int>> &Inf) {
  int i;
  priority_queue<State> pq;
  for (i = 0; i < (int)Inf.size(); ++i) pq.push({0, Inf[i].first, 0, i});
  for (; !pq.empty();) {
    auto a = pq.top();
    pq.pop();
    if (Vis[a.City]) continue;
    Vis[a.City] = 1;
    Tulos[a.City] = a.Origin + 1;
    for (auto &[u, w] : E[a.City])
      if (!Vis[u]) {
        if (a.Spread < w) {
          int U =
              (w - a.Spread + Inf[a.Origin].second - 1) / Inf[a.Origin].second;
          pq.push({a.Round + U, u, U * Inf[a.Origin].second - w + a.Spread,
                   a.Origin});
        } else
          pq.push({a.Round, u, a.Spread - w, a.Origin});
      }
  }
}
void Solve() {
  int i;
  int A, B;
  scanf("%d%d", &A, &B);
  int it = 0;
  vector<pair<int, int>> Inf;
  for (i = 1; i <= A; ++i) {
    int a, b;
    scanf("%d%d", &a, &b);
    Inf.emplace_back(a, b);
    Nds[++it] = a;
  }
  vector<int> Imp;
  for (i = 1; i <= B; ++i) {
    int x;
    scanf("%d", &x);
    Imp.push_back(x);
    Nds[++it] = x;
  }
  CreateInduced(it);
  CalcCities(Inf);
  for (i = 0; i < B; ++i) printf("%d ", Tulos[Imp[i]]);
  puts("");
}
int main() {
  int i;
  scanf("%d", &N);
  for (i = 2; i <= N; ++i) {
    int a, b;
    scanf("%d%d", &a, &b);
    V[a].push_back(b);
    V[b].push_back(a);
  }
  Haku(1, 1);
  scanf("%d", &Q);
  while (Q--) Solve();
}
