#include <bits/stdc++.h>
using namespace std;
const int asize = 4e5 + 5, inf = 1e9;
vector<int> adjl[asize], rest;
int n, k, r, ufdsp[asize], md[asize], p[asize][24], depth[asize], dist[asize],
    col[asize];
bool rs[asize], vis[asize];
queue<tuple<int, int, int, int> > q;
int findset(int u) {
  if (ufdsp[u] == u) return u;
  ufdsp[u] = findset(ufdsp[u]);
  return ufdsp[u];
}
void mergeset(int a, int b) {
  int pa = findset(a), pb = findset(b);
  if (pa != pb) ufdsp[pa] = pb;
  return;
}
void bfs(int pos, int weight, int par, int head) {
  if (vis[pos] == 1) return;
  vis[pos] = 1;
  col[pos] = head;
  if (weight == k + 1) return;
  for (auto x : adjl[pos]) {
    if (x == par)
      continue;
    else if (vis[x]) {
      mergeset(head, col[x]);
    }
    q.emplace(x, weight + 1, pos, head);
  }
}
void roottree(int par, int chi) {
  p[chi][0] = par;
  for (auto x : adjl[chi]) {
    if (x == par) continue;
    depth[x] = depth[chi] + 1;
    dist[x] = dist[chi] + 1;
    roottree(chi, x);
  }
  return;
}
inline void lca_init() {
  roottree(-1, 1);
  for (int j = 1; j < 21; j++) {
    for (int i = 1; i <= n; i++) {
      if (p[i][j - 1] == -1)
        p[i][j] = -1;
      else
        p[i][j] = p[p[i][j - 1]][j - 1];
    }
  }
}
int fp(int x, int k) {
  assert(k >= 0);
  for (int i = 20; i >= 0; i--) {
    if (k >= (1 << i)) {
      x = p[x][i];
      k -= (1 << i);
    }
    if (x == -1) return x;
    if (k == 0) break;
  }
  return x;
}
int lca(int a, int b) {
  if (depth[a] > depth[b]) a = fp(a, depth[a] - depth[b]);
  if (depth[b] > depth[a]) b = fp(b, depth[b] - depth[a]);
  if (a == b) return a;
  for (int i = 20; i >= 0; i--) {
    if (i == -1) break;
    if (p[a][i] != p[b][i]) {
      a = p[a][i];
      b = p[b][i];
    }
  }
  return p[a][0];
}
int walk(int a, int b, int c) {
  if (depth[a] - depth[c] >= k)
    return fp(a, k);
  else {
    int extra = k - (depth[a] - depth[c]);
    return fp(b, depth[b] - depth[c] - extra);
  }
}
int main() {
  ios_base::sync_with_stdio(0), cin.tie(NULL);
  cin >> n >> k >> r;
  int a, b, v;
  for (int i = 0; i < n - 1; i++) {
    cin >> a >> b;
    adjl[a].push_back(n + i + 1);
    adjl[b].push_back(n + i + 1);
    adjl[n + i + 1].push_back(a);
    adjl[n + i + 1].push_back(b);
  }
  n += (n - 1);
  for (int i = 0; i < r; i++) {
    cin >> a;
    rs[a] = 1;
    rest.push_back(a);
  }
  for (int i = 1; i <= n; i++) ufdsp[i] = i, md[i] = inf;
  for (int i = 0; i <= n; i++) vis[i] = 0;
  for (auto x : rest) {
    q.emplace(x, 0, -1, x);
  }
  while (!q.empty()) {
    int aa, bb, cc, dd;
    tie(aa, bb, cc, dd) = q.front();
    q.pop();
    bfs(aa, bb, cc, dd);
  }
  lca_init();
  cin >> v;
  for (int i = 0; i < v; i++) {
    cin >> a >> b;
    int c = lca(a, b);
    if ((dist[a] + dist[b] - 2 * dist[c]) <= 2 * k)
      cout << "YES\n";
    else {
      a = walk(a, b, c);
      b = walk(b, a, c);
      if (findset(col[a]) == findset(col[b]) && col[a] > 0)
        cout << "YES\n";
      else
        cout << "NO\n";
    }
  }
  return 0;
}
