#include <bits/stdc++.h>
using namespace std;
int n, k, r, c, logc, npow;
vector<int> tree[400400];
int dist[400400], par[400400], dep[400400];
int jump[400400][30];
int p[400400], ranks[400400];
int getp(int curr) {
  if (curr == p[curr]) return curr;
  p[curr] = getp(p[curr]);
  return p[curr];
}
void Union(int a, int b) {
  if (a == b) return;
  if (ranks[a] == ranks[b]) ranks[a]++;
  if (ranks[a] > ranks[b])
    p[b] = a;
  else
    Union(b, a);
}
void dfs(int curr, int l, int d) {
  dep[curr] = d;
  for (int i : tree[curr])
    if (i != l) par[i] = curr, dfs(i, curr, d + 1);
}
void build() {
  logc = 1;
  npow = 2;
  for (int i = 0; i < c; i++) jump[i][0] = par[i];
  while (npow <= c) {
    for (int i = 0; i < c; i++) {
      jump[i][logc] = jump[jump[i][logc - 1]][logc - 1];
    }
    npow *= 2;
    logc++;
  }
}
int getpar(int n1, int v) {
  int curr = n1;
  int walked = 0;
  for (int i = logc; i >= 0; i--) {
    if (walked + (1 << i) <= v) {
      curr = jump[curr][i];
      walked += (1 << i);
    }
  }
  return curr;
}
int lca(int n1, int n2) {
  int c1 = n1, c2 = n2;
  if (dep[n1] > dep[n2]) {
    c1 = getpar(c1, dep[n1] - dep[n2]);
  }
  if (dep[n2] > dep[n1]) {
    c2 = getpar(c2, dep[n2] - dep[n1]);
  }
  if (c1 == c2) return c1;
  for (int i = logc - 1; i >= 0; i--)
    if (jump[c1][i] != jump[c2][i]) c1 = jump[c1][i], c2 = jump[c2][i];
  return jump[c1][0];
}
int main() {
  scanf(" %d%d%d", &n, &k, &r);
  c = n;
  for (int i = 0; i < n - 1; i++) {
    int n1, n2;
    scanf(" %d%d", &n1, &n2);
    n1--;
    n2--;
    tree[n1].push_back(c);
    tree[c].push_back(n1);
    tree[c].push_back(n2);
    tree[n2].push_back(c);
    c++;
  }
  for (int i = 0; i < c; i++) {
    dist[i] = 999999;
    p[i] = i;
    ranks[i] = 0;
  }
  queue<int> curr;
  for (int i = 0; i < r; i++) {
    int v;
    scanf("%d", &v);
    dist[v - 1] = 0;
    curr.push(v - 1);
  }
  while (curr.size()) {
    int v = curr.front();
    curr.pop();
    if (dist[v] >= k) break;
    for (int i : tree[v]) {
      Union(getp(i), getp(v));
      if (dist[i] >= 400400) {
        curr.push(i);
        dist[i] = dist[v] + 1;
      }
    }
  }
  dfs(0, -1, 0);
  par[0] = 0;
  build();
  int m;
  scanf("%d", &m);
  for (int i = 0; i < m; i++) {
    int n1, n2;
    scanf(" %d%d", &n1, &n2);
    n1--;
    n2--;
    int l = lca(n1, n2);
    int d12 = dep[n1] + dep[n2] - 2 * dep[l];
    if (d12 <= 2 * k) {
      printf("YES\n");
      continue;
    }
    int walk1, walk2;
    int d1 = dep[n1] - dep[l], d2 = dep[n2] - dep[l];
    if (d1 >= k)
      walk1 = getpar(n1, k);
    else {
      int rem = k - d1;
      int v = d2 - rem;
      walk1 = getpar(n2, v);
    }
    if (d2 >= k)
      walk2 = getpar(n2, k);
    else {
      int rem = k - d2;
      int v = d1 - rem;
      walk2 = getpar(n1, v);
    }
    printf((getp(walk1) == getp(walk2)) ? "YES\n" : "NO\n");
  }
}
