#include <bits/stdc++.h>
using namespace std;
const int N = 400005;
int n, k, r, u, v, q, rest[N];
struct Edge {
  int nxt, to;
} edge[N << 1];
int head[N], edgeNum;
void addEdge(int from, int to) {
  edge[++edgeNum] = (Edge){head[from], to};
  head[from] = edgeNum;
}
struct LCA {
  int fa[N][25], dep[N];
  void dfs(int x, int f, int depth) {
    dep[x] = depth;
    fa[x][0] = f;
    for (int i = head[x]; i; i = edge[i].nxt) {
      if (edge[i].to == f) continue;
      dfs(edge[i].to, x, depth + 1);
    }
  }
  void init() {
    for (int j = 1; (1 << j) <= n; j++)
      for (int i = 1; i <= n; i++)
        if (fa[i][j - 1]) fa[i][j] = fa[fa[i][j - 1]][j - 1];
  }
  int lca(int x, int y) {
    if (dep[x] < dep[y]) swap(x, y);
    for (int i = 20; i >= 0; i--)
      if (dep[x] - (1 << i) >= dep[y]) x = fa[x][i];
    if (x == y) return x;
    for (int i = 20; i >= 0; i--) {
      if (fa[x][i] && fa[x][i] != fa[y][i]) {
        x = fa[x][i];
        y = fa[y][i];
      }
    }
    return fa[x][0];
  }
  inline int up(int x, int d) {
    for (int i = 20; i >= 0; i--) {
      if ((1 << i) <= d) {
        d -= (1 << i);
        x = fa[x][i];
      }
    }
    return x;
  }
} lca;
struct DSU {
  int fa[N];
  inline void init() {
    for (int i = 1; i <= n; i++) fa[i] = i;
  }
  int findfa(int x) { return fa[x] == x ? x : fa[x] = findfa(fa[x]); }
  inline void unionn(int x, int y) { fa[findfa(y)] = findfa(x); }
} dsu;
int dis[N];
queue<int> que;
inline void bfs() {
  for (int i = 1; i <= n; i++) dis[i] = -1;
  for (int i = 1; i <= r; i++) {
    que.push(rest[i]);
    dis[rest[i]] = 0;
  }
  while (!que.empty()) {
    int cur = que.front();
    que.pop();
    if (dis[cur] == k) continue;
    for (int i = head[cur]; i; i = edge[i].nxt) {
      if (dis[edge[i].to] == -1) {
        que.push(edge[i].to);
        dis[edge[i].to] = dis[cur] + 1;
      }
      dsu.unionn(cur, edge[i].to);
    }
  }
}
int main() {
  scanf("%d%d%d", &n, &k, &r);
  for (int i = 1; i < n; i++) {
    scanf("%d%d", &u, &v);
    addEdge(u, n + i), addEdge(n + i, u);
    addEdge(n + i, v), addEdge(v, n + i);
  }
  n += n - 1;
  dsu.init();
  for (int i = 1; i <= r; i++) scanf("%d", &rest[i]);
  bfs();
  lca.dfs(1, 0, 1);
  lca.init();
  scanf("%d", &q);
  while (q--) {
    scanf("%d%d", &u, &v);
    int uvlca = lca.lca(u, v);
    if (lca.dep[u] + lca.dep[v] - 2 * lca.dep[uvlca] <= 2 * k) {
      puts("YES");
      continue;
    }
    if (lca.dep[u] - lca.dep[uvlca] >= k)
      u = lca.up(u, k);
    else
      u = lca.up(v, lca.dep[v] + lca.dep[u] - 2 * lca.dep[uvlca] - k);
    if (lca.dep[v] - lca.dep[uvlca] >= k)
      v = lca.up(v, k);
    else
      v = lca.up(u, lca.dep[v] + lca.dep[u] - 2 * lca.dep[uvlca] - k);
    if (dsu.findfa(u) == dsu.findfa(v))
      puts("YES");
    else
      puts("NO");
  }
  return 0;
}
