#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 2e5 + 10;
const int INF = 1e9 + 10;
int parent[20][MAX_N], N, K, R, dep[MAX_N];
vector<int> g[MAX_N];
vector<pair<int, int> > edge;
bool rest[MAX_N];
void dfs(int x, int fa) {
  parent[0][x] = fa;
  for (int i = 0; i < g[x].size(); i++) {
    int to = g[x][i];
    if (to == fa) continue;
    dep[to] = dep[x] + 1;
    dfs(to, x);
  }
}
void get_lca() {
  for (int k = 0; k + 1 < 20; k++) {
    for (int i = 0; i < N; i++) {
      if (parent[k][i] == -1)
        parent[k + 1][i] = -1;
      else
        parent[k + 1][i] = parent[k][parent[k][i]];
    }
  }
}
int lca(int u, int v) {
  if (dep[u] > dep[v]) swap(u, v);
  for (int k = 0; k < 20; k++) {
    if ((dep[u] - dep[v]) >> k & 1) {
      v = parent[k][v];
    }
  }
  if (u == v) return u;
  for (int k = 19; k >= 0; k--) {
    if (parent[k][u] != parent[k][v]) {
      u = parent[k][u];
      v = parent[k][v];
    }
  }
  return parent[0][u];
}
queue<int> Q;
int dist[MAX_N], fa[MAX_N], cnt[MAX_N];
int getfa(int x) { return fa[x] == x ? x : fa[x] = getfa(fa[x]); }
void unite(int a, int b) {
  a = getfa(a);
  b = getfa(b);
  if (a == b) return;
  fa[a] = b;
}
int ances(int x, int k) {
  for (int i = 0; i < 20; i++) {
    if (k >> i & 1) {
      x = parent[i][x];
    }
  }
  return x;
}
int main() {
  scanf("%d%d%d", &N, &K, &R);
  for (int i = 0; i < N - 1; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    u--;
    v--;
    g[u].push_back(v);
    g[v].push_back(u);
    edge.push_back(make_pair(u, v));
  }
  dfs(0, -1);
  get_lca();
  for (int i = 0; i < N; i++) dist[i] = INF;
  for (int i = 0; i < R; i++) {
    int x;
    scanf("%d", &x);
    x--;
    rest[x] = true;
    Q.push(x);
    dist[x] = 0;
  }
  for (int i = 0; i < N; i++) fa[i] = i;
  while (!Q.empty()) {
    int x = Q.front();
    Q.pop();
    if (dist[x] >= K / 2) continue;
    for (int i = 0; i < g[x].size(); i++) {
      int to = g[x][i];
      if (dist[to] > dist[x] + 1) {
        dist[to] = dist[x] + 1;
        Q.push(to);
      }
      unite(to, x);
    }
  }
  if (K % 2 == 1) {
    for (int i = 0; i < N; i++)
      if (rest[i]) cnt[getfa(i)]++;
    for (int i = 0; i < edge.size(); i++) {
      int u = edge[i].first, v = edge[i].second;
      if (cnt[getfa(u)] > 0 && cnt[getfa(v)] > 0) unite(u, v);
    }
  }
  for (int i = 0; i < N; i++) cnt[i] = 0;
  for (int i = 0; i < N; i++)
    if (rest[i]) cnt[getfa(i)]++;
  int q;
  scanf("%d", &q);
  for (int test = 0; test < q; test++) {
    int u, v;
    scanf("%d%d", &u, &v);
    u--;
    v--;
    if (getfa(u) == getfa(v)) {
      printf("YES\n");
      continue;
    }
    int r = lca(u, v);
    if (dep[u] + dep[v] - 2 * dep[r] <= K) {
      printf("YES\n");
      continue;
    }
    int nu, nv;
    if (dep[u] - dep[r] >= K - K / 2)
      nu = ances(u, K - K / 2);
    else
      nu = ances(v, dep[v] + dep[u] - dep[r] * 2 - K + K / 2);
    if (dep[v] - dep[r] >= K - K / 2)
      nv = ances(v, K - K / 2);
    else
      nv = ances(u, dep[v] + dep[u] - dep[r] * 2 - K + K / 2);
    if (getfa(nu) == getfa(nv) && cnt[getfa(nu)] > 0) {
      printf("YES\n");
      continue;
    }
    printf("NO\n");
  }
  return 0;
}
