#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline T read(T &x) {
  char c = getchar();
  bool f = 0;
  x = 0;
  while (!isdigit(c)) f |= c == '-', c = getchar();
  while (isdigit(c)) x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
  if (f) x = -x;
  return x;
}
template <typename T, typename... Args>
inline void read(T &x, Args &...args) {
  read(x);
  read(args...);
}
template <typename T>
inline void write(T x) {
  if (x < 0)
    putchar('-'), write(-x);
  else {
    if (x > 9) write(x / 10);
    putchar('0' + x % 10);
  }
}
int N, K, R, Q;
int par[400005][19], dep[400005], grp[400005], color[400005], dist[400005];
vector<int> con[400005];
void add_edge(int a, int b) {
  con[a].push_back(b);
  con[b].push_back(a);
}
int find(int n) { return grp[n] == n ? n : (grp[n] = find(grp[n])); }
void dfs(int n) {
  for (int t : con[n])
    if (t != par[n][0]) {
      par[t][0] = n;
      dep[t] = dep[n] + 1;
      dfs(t);
    }
}
inline int lca(int a, int b) {
  if (dep[a] < dep[b]) swap(a, b);
  for (int i = 19; i--;)
    if (dep[a] - dep[b] & 1 << i) a = par[a][i];
  if (a == b) return a;
  for (int i = 19; i--;)
    if (par[a][i] != par[b][i]) a = par[a][i], b = par[b][i];
  return par[a][0];
}
int go_k_step(int a, int b, int c) {
  if (dep[a] - dep[c] < K) {
    int left = dep[b] - dep[c] - (K - (dep[a] - dep[c]));
    for (int i = 19; i--;)
      if (left & 1 << i) b = par[b][i];
    return b;
  } else {
    for (int i = 19; i--;)
      if (K & 1 << i) a = par[a][i];
    return a;
  }
}
int main() {
  read(N, K, R);
  for (int i = 1; i < N; i++) {
    int a, b, c = N + i;
    read(a, b);
    add_edge(a, c);
    add_edge(c, b);
  }
  N += N - 1;
  queue<int> que;
  for (int i = 1; i <= R; i++) {
    int v;
    read(v);
    grp[i] = i;
    color[v] = i;
    dist[v] = 0;
    que.push(v);
  }
  while (!que.empty()) {
    int q = que.front();
    que.pop();
    color[q] = find(color[q]);
    if (dist[q] == K) continue;
    for (int t : con[q]) {
      if (color[t]) {
        color[t] = find(color[t]);
        grp[color[t]] = color[q];
      } else {
        color[t] = color[q];
        dist[t] = dist[q] + 1;
        que.push(t);
      }
    }
  }
  for (int i = 1; i <= N; i++) color[i] = find(color[i]);
  par[1][0] = 1;
  dfs(1);
  for (int k = 1; k < 19; k++)
    for (int i = 1; i <= N; i++) par[i][k] = par[par[i][k - 1]][k - 1];
  for (read(Q); Q--;) {
    int a, b;
    read(a, b);
    int c = lca(a, b);
    if (dep[a] - dep[c] + dep[b] - dep[c] <= K + K) {
      puts("YES");
      continue;
    }
    int na = go_k_step(a, b, c);
    int nb = go_k_step(b, a, c);
    if (color[na] && color[na] == color[nb])
      puts("YES");
    else
      puts("NO");
  }
}
