#include <bits/stdc++.h>
using namespace std;
constexpr int maxn = 5e5 + 100, maxdep = 20;
struct IO {
 private:
  static constexpr int ibufsiz = 1 << 20;
  char ibuf[ibufsiz + 1], *inow = ibuf, *ied = ibuf;
  static constexpr int obufsiz = 1 << 20;
  char obuf[obufsiz + 1], *onow = obuf;
  const char *oed = obuf + obufsiz;

 public:
  char getchar() {
    if (inow == ied) {
      ied = ibuf + sizeof(char) * fread(ibuf, sizeof(char), ibufsiz, stdin);
      *ied = '\0';
      inow = ibuf;
    }
    return *inow++;
  }
  template <typename T>
  void read(T &x) {
    static bool flg;
    flg = 0;
    x = 0;
    char c = getchar();
    while (!isdigit(c)) flg = c == '-' ? 1 : flg, c = getchar();
    while (isdigit(c)) x = x * 10 + c - '0', c = getchar();
    if (flg) x = -x;
  }
  template <typename T, typename... Y>
  void read(T &x, Y &...X) {
    read(x);
    read(X...);
  }
  int readi() {
    static int res;
    read(res);
    return res;
  }
  long long readll() {
    static long long res;
    read(res);
    return res;
  }
  void flush() {
    fwrite(obuf, sizeof(char), onow - obuf, stdout);
    fflush(stdout);
    onow = obuf;
  }
  void putchar(const char c) {
    *onow++ = c;
    if (onow == oed) {
      fwrite(obuf, sizeof(char), obufsiz, stdout);
      onow = obuf;
    }
  }
  template <typename T>
  void write(T x, const char split = '\0') {
    static unsigned char buf[32];
    if (x < 0) putchar('-'), x = -x;
    int p = 0;
    do {
      buf[++p] = x % 10;
      x /= 10;
    } while (x);
    for (int i = p; i >= 1; i--) putchar(buf[i] + '0');
    if (split != '\0') putchar(split);
  }
  void puts(char const *str, const char split = '\n') {
    while (*str) putchar(*(str++));
    putchar(split);
  }
  void lf() { putchar('\n'); }
  ~IO() { fwrite(obuf, sizeof(char), onow - obuf, stdout); }
} io;
vector<int> G[maxn];
void addedge(const int u, const int v) { G[u].push_back(v); }
int n, lim, r, tot, mark[maxn], f[maxn], dep[maxn], faz[maxn][maxdep + 1],
    bel[maxn];
void dfs(const int u) {
  for (int i = 1; i <= maxdep; i++) faz[u][i] = faz[faz[u][i - 1]][i - 1];
  dep[1] = 1;
  for (int v : G[u]) {
    if (v == faz[u][0]) continue;
    faz[v][0] = u;
    dep[v] = dep[u] + 1;
    dfs(v);
  }
}
int lca(int x, int y) {
  if (dep[x] < dep[y]) swap(x, y);
  for (int i = maxdep; i >= 0; i--)
    if (dep[faz[x][i]] >= dep[y]) x = faz[x][i];
  if (x == y) return x;
  for (int i = maxdep; i >= 0; i--)
    if (faz[x][i] != faz[y][i]) x = faz[x][i], y = faz[y][i];
  return faz[x][0];
}
int find(const int x) { return x == f[x] ? x : f[x] = find(f[x]); }
void merge(const int a, const int b) {
  const int x = find(a), y = find(b);
  f[x] = y;
}
void init() {
  queue<int> q;
  for (int i = 1; i <= tot; i++)
    if (mark[i]) q.push(i), bel[i] = i;
  for (int i = 1; i <= tot; i++) f[i] = i;
  for (int i = 1; i <= lim; i++) {
    int mem = q.size();
    while (mem--) {
      const int u = q.front();
      q.pop();
      for (int v : G[u]) {
        if (!bel[v])
          bel[v] = bel[u], f[v] = find(u), q.push(v);
        else if (bel[v] != bel[u])
          merge(u, v);
      }
    }
  }
}
int walk(const int x, const int y) {
  auto kth = [](int u, const int k) {
    for (int i = 0; i <= maxdep; i++)
      if ((k >> i) & 1) u = faz[u][i];
    return u;
  };
  const int l = lca(x, y);
  if (lim <= dep[x] - dep[l]) return kth(x, lim);
  return kth(y, (dep[y] - dep[l]) - (lim - (dep[x] - dep[l])));
}
int main() {
  io.read(n, lim, r);
  tot = n;
  for (int u, v, i = 1; i < n; i++) {
    io.read(u, v);
    tot++;
    addedge(u, tot);
    addedge(tot, u);
    addedge(v, tot);
    addedge(tot, v);
  }
  dfs(1);
  for (int i = 1; i <= r; i++) mark[io.readi()] = 1;
  init();
  const int q = io.readi();
  for (int x, y, i = 1; i <= q; i++) {
    io.read(x, y);
    const int l = lca(x, y);
    if (dep[x] + dep[y] - 2 * dep[l] <= 2 * lim) {
      puts("YES");
      continue;
    }
    if (find(walk(x, y)) == find(walk(y, x))) {
      puts("YES");
      continue;
    }
    puts("NO");
  }
  return 0;
}
