#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
int n, k, r, esp[400100], dist[400100], p[400100];
int dep[400100], P[400100][19];
vector<int> adj[400100];
struct UF {
  int p[400100];
  UF() {
    for (int i = int(0); i < int(400100); ++i) p[i] = i;
  }
  int find(int i) { return (p[i] == i) ? i : (p[i] = find(p[i])); }
  void join(int i, int j) { p[find(i)] = find(j); }
};
UF uf;
void go() {
  queue<int> q;
  for (int i = 1; i <= 2 * n; ++i) {
    if (esp[i]) {
      p[i] = i;
      dist[i] = 0;
      q.push(i);
    } else
      dist[i] = INF;
  }
  while (int(q.size())) {
    int u = q.front();
    q.pop();
    if (dist[u] == k) continue;
    for (int v : adj[u]) {
      if (dist[v] == INF) {
        uf.join(u, v);
        p[v] = p[u];
        dist[v] = dist[u] + 1;
        q.push(v);
      } else if (p[u] != p[v] && uf.find(u) != uf.find(v)) {
        uf.join(u, v);
      }
    }
  }
}
void dfs(int u, int p = -1, int d = 0) {
  dep[u] = d;
  P[u][0] = p;
  for (int i = 1; i < 19 && P[u][i - 1] != -1; ++i)
    P[u][i] = P[P[u][i - 1]][i - 1];
  for (int v : adj[u])
    if (v != p) dfs(v, u, d + 1);
}
int go_up(int a, int d) {
  for (int i = 19 - 1; i >= 0; --i) {
    if (d & (1 << i)) a = P[a][i];
  }
  return a;
}
int __lca(int a, int b) {
  if (dep[a] > dep[b]) swap(a, b);
  for (int i = 19 - 1; i >= 0; --i) {
    if (dep[b] - (1 << i) >= dep[a]) b = P[b][i];
  }
  if (a == b) return a;
  for (int i = 19 - 1; i >= 0; --i) {
    if (P[a][i] != P[b][i]) a = P[a][i], b = P[b][i];
  }
  return P[a][0];
}
inline int getDist(int a, int b) {
  return dep[a] + dep[b] - 2 * dep[__lca(a, b)];
}
int walk(int u, int v, int steps) {
  int lca = __lca(u, v);
  int d = dep[u] - dep[lca];
  if (steps <= d) return go_up(u, steps);
  steps -= d;
  d = dep[v] - dep[lca];
  return go_up(v, d - steps);
}
int main() {
  memset(P, -1, sizeof(P));
  int a, b;
  scanf("%d %d %d", &n, &k, &r);
  for (int i = 0; i < n - 1; ++i) {
    scanf("%d %d", &a, &b);
    adj[a].push_back(n + 1 + i);
    adj[n + 1 + i].push_back(a);
    adj[b].push_back(n + 1 + i);
    adj[n + 1 + i].push_back(b);
  }
  for (int i = 0; i < r; ++i) {
    scanf("%d", &a);
    esp[a] = 1;
  }
  go();
  dfs(1);
  int v;
  scanf("%d", &v);
  while (v--) {
    scanf("%d %d", &a, &b);
    if (uf.find(a) == uf.find(b) or getDist(a, b) <= 2 * k) {
      printf("YES\n");
      continue;
    }
    bool ok = false;
    int u = walk(a, b, k);
    int v = walk(b, a, k);
    if (uf.find(u) == uf.find(v) or uf.find(a) == uf.find(v) or
        uf.find(b) == uf.find(u))
      ok = true;
    printf(ok ? "YES\n" : "NO\n");
  }
  return 0;
}
