#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5, maxm = 4e5 + 5;
int head[maxn], nume;
struct edge {
  int v, w, c, next;
} e[maxm];
inline void init_edge() {
  memset(head, -1, sizeof head);
  nume = 0;
}
inline void add_edge(int u, int v, int w = 0, int c = 0) {
  e[nume].v = v;
  e[nume].w = w;
  e[nume].c = c;
  e[nume].next = head[u];
  head[u] = nume++;
}
int dep[maxn], dp[maxn][20], numpow = 19;
void dfs(int u, int f) {
  dep[u] = dep[f] + 1;
  dp[u][0] = f;
  for (int i = 1; i <= numpow; ++i) dp[u][i] = dp[dp[u][i - 1]][i - 1];
  for (int i = head[u]; ~i; i = e[i].next) {
    int v = e[i].v;
    if (v == f) continue;
    dfs(v, u);
  }
}
int lca(int u, int v) {
  if (dep[u] > dep[v]) swap(u, v);
  if (dep[u] < dep[v]) {
    int tmp = dep[v] - dep[u];
    for (int i = 0; i <= numpow; ++i)
      if (tmp & (1 << i)) v = dp[v][i];
  }
  if (u != v) {
    for (int i = numpow; ~i; --i)
      if (dp[u][i] != dp[v][i]) u = dp[u][i], v = dp[v][i];
    u = v = dp[u][0];
  }
  return u;
}
int ff(int u, int num) {
  for (int i = 0; (1 << i) <= num; i++) {
    if (num & (1 << i)) u = dp[u][i];
  }
  return u;
}
int f[maxn];
int find(int x) {
  if (x == f[x]) return x;
  return f[x] = find(f[x]);
}
int he(int u, int v) {
  u = find(u);
  v = find(v);
  if (u != v) f[u] = v;
}
queue<int> que;
int n, k, r, q;
int vis[maxn];
int main() {
  scanf("%d%d%d", &n, &k, &r);
  init_edge();
  for (int i = 1; i < n; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    add_edge(u, v);
    add_edge(v, u);
  }
  memset(vis, -1, sizeof vis);
  for (int i = 1; i <= r; i++) {
    int u;
    scanf("%d", &u);
    vis[u] = 0;
    que.push(u);
  }
  while (!que.empty()) {
    int u = que.front();
    que.pop();
    for (int i = head[u]; ~i; i = e[i].next) {
      int v = e[i].v;
      if (vis[v] == -1) {
        vis[v] = vis[u] + 1;
        que.push(v);
      }
    }
  }
  for (int i = 1; i <= n; i++) f[i] = i;
  for (int u = 1; u <= n; u++) {
    for (int i = head[u]; ~i; i = e[i].next) {
      int v = e[i].v;
      if (vis[u] + vis[v] < k) {
        he(u, v);
      }
    }
  }
  dfs(1, 0);
  scanf("%d", &q);
  while (q--) {
    int u, v, Lca, U, V;
    scanf("%d%d", &u, &v);
    Lca = lca(u, v);
    if (dep[u] + dep[v] - 2 * dep[Lca] <= k)
      printf("YES\n");
    else {
      if (dep[u] - dep[Lca] >= (k + 1) / 2)
        U = ff(u, (k + 1) / 2);
      else
        U = ff(v, dep[u] + dep[v] - 2 * dep[Lca] - (k + 1) / 2);
      if (dep[v] - dep[Lca] >= (k + 1) / 2)
        V = ff(v, (k + 1) / 2);
      else
        V = ff(u, dep[u] + dep[v] - 2 * dep[Lca] - (k + 1) / 2);
      if (find(U) == find(V) && vis[U] <= k / 2 && vis[V] <= k / 2)
        printf("YES\n");
      else
        printf("NO\n");
    }
  }
}
