#include <bits/stdc++.h>
template <typename T>
inline void read(T &x) {
  x = 0;
  char c = getchar();
  bool flag = false;
  while (!isdigit(c)) {
    if (c == '-') flag = true;
    c = getchar();
  }
  while (isdigit(c)) x = x * 10 + (c ^ 48), c = getchar();
  if (flag) x = -x;
}
using namespace std;
int n, K, R, ptot;
struct edge {
  int nxt, to;
  edge() {}
  edge(int jzp, int zzz) { nxt = jzp, to = zzz; }
} e[401000 << 1];
int head[401000], ecnt;
inline void addedge(int from, int to) {
  e[++ecnt] = edge(head[from], to);
  head[from] = ecnt;
}
inline void Addedge(int u, int v) { addedge(u, v), addedge(v, u); }
int fath[401000];
int find(int cur) {
  return fath[cur] == cur ? cur : fath[cur] = find(fath[cur]);
}
int que[401000], front, rear;
int jzpdis[401000];
inline void bfs() {
  memset(jzpdis, 0x3f, sizeof(jzpdis));
  for (int i = 1; i <= rear; ++i) jzpdis[que[i]] = 0;
  while (front < rear) {
    int cur = que[++front];
    if (jzpdis[cur] >= K) continue;
    for (int i = head[cur]; i; i = e[i].nxt) {
      int to = e[i].to;
      int fcur = find(cur), fto = find(to);
      if (fcur == fto) continue;
      fath[fcur] = fto;
      if (jzpdis[to] > jzpdis[cur] + 1)
        que[++rear] = to, jzpdis[to] = jzpdis[cur] + 1;
    }
  }
}
int f[401000][20], dep[401000], Lg2[401000];
void dfs_dep(int cur, int faa) {
  f[cur][0] = faa;
  dep[cur] = dep[faa] + 1;
  for (int i = 1; i <= Lg2[dep[cur]]; ++i) f[cur][i] = f[f[cur][i - 1]][i - 1];
  for (int i = head[cur]; i; i = e[i].nxt) {
    int to = e[i].to;
    if (to == faa) continue;
    dfs_dep(to, cur);
  }
}
inline int get_lca(int x, int y) {
  if (dep[x] < dep[y]) swap(x, y);
  for (int j = Lg2[dep[x]]; ~j; --j)
    if (dep[f[x][j]] >= dep[y]) x = f[x][j];
  if (x == y) return x;
  for (int j = Lg2[dep[x]]; ~j; --j)
    if (f[x][j] != f[y][j]) x = f[x][j], y = f[y][j];
  return f[x][0];
}
inline int get_kth_anc(int x, int k) {
  for (int j = Lg2[k]; ~j; --j)
    if ((1 << j) <= k) x = f[x][j], k -= (1 << j);
  return x;
}
int main() {
  read(n), read(K), read(R);
  ptot = n;
  Lg2[0] = -1;
  for (int i = 1; i <= n + n - 1; ++i) Lg2[i] = Lg2[i >> 1] + 1;
  for (int i = 1; i < n; ++i) {
    int u, v;
    read(u), read(v);
    ++ptot;
    Addedge(u, ptot), Addedge(ptot, v);
  }
  n = n + n - 1;
  for (int i = 1; i <= n; ++i) fath[i] = i;
  for (int i = 1; i <= R; ++i) {
    int x;
    read(x);
    que[++rear] = x;
  }
  bfs();
  dfs_dep(1, 0);
  int q;
  read(q);
  while (q--) {
    int x, y;
    read(x), read(y);
    int lca = get_lca(x, y), d = dep[x] + dep[y] - (dep[lca] << 1);
    if (d <= K + K) {
      puts("YES");
      continue;
    } else {
      int nx, ny;
      if (dep[x] - dep[lca] >= K)
        nx = get_kth_anc(x, K);
      else
        nx = get_kth_anc(y, d - K);
      if (dep[y] - dep[lca] >= K)
        ny = get_kth_anc(y, K);
      else
        ny = get_kth_anc(x, d - K);
      puts(find(nx) == find(ny) ? "YES" : "NO");
    }
  }
  return 0;
}
