#include <bits/stdc++.h>
using namespace std;
int const N = 200000, B = 18;
int pa[N + 1], n, k, r, mndp[N + 1], dp[N + 1], up[N + 1][B];
vector<int> tr[N + 1], qv[N + 1];
bool sp[N + 1], an[N];
set<pair<int, int> > st[N + 1], st2[N + 1];
pair<int, int> qu[N];
int P(int v) { return pa[v] ? pa[v] = P(pa[v]) : v; }
void J(int a, int b) {
  a = P(a), b = P(b);
  if (a == b) return;
  pa[b] = a;
  if (mndp[b] < mndp[a]) mndp[a] = mndp[b];
}
void go(int v = 1, int p = 0) {
  for (int u : tr[v])
    if (u != p) go(u, v);
  int &d = dp[v];
  mndp[v] = d;
  if (sp[v]) {
    for (int u : tr[v]) {
      while (!st[u].empty() && st[u].begin()->first <= d + k) {
        J(st[u].begin()->second, v);
        st[u].erase(st[u].begin());
      }
      while (!st2[u].empty() && st2[u].begin()->first <= d + k) {
        J(st2[u].begin()->second, v);
        st2[u].erase(st2[u].begin());
      }
      st[u].clear();
      st2[u].clear();
    }
    st[v].insert(make_pair(d, P(v)));
  } else {
    int mn = 0;
    for (int u : tr[v])
      if (!st[u].empty() &&
          (mn == 0 || st[u].begin()->first < st[mn].begin()->first))
        mn = u;
    if (mn) {
      for (int u : tr[v])
        if (u != mn) {
          while (!st[u].empty() &&
                 st[u].begin()->first - d + st[mn].begin()->first - d <= k) {
            J(st[u].begin()->second, st[mn].begin()->second);
            st[u].erase(st[u].begin());
          }
          auto it = st2[u].lower_bound(make_pair(st[mn].begin()->first, 0));
          while (it != st2[u].end() &&
                 it->first - d + st[mn].begin()->first - d <= k) {
            J(it->second, st[mn].begin()->second);
            st2[u].erase(it++);
          }
        }
    }
    auto up = [&](set<pair<int, int> > st[]) {
      mn = 0;
      for (int u : tr[v])
        if (st[u].size() > st[mn].size()) mn = u;
      swap(st[v], st[mn]);
      for (int u : tr[v]) {
        for (auto it = st[u].begin(); it != st[u].end(); ++it)
          st[v].insert(*it);
        st[u].clear();
      }
    };
    up(st);
    up(st2);
    st2[v].insert(make_pair(d, v));
  }
  for (int t : qv[v])
    if (mndp[P(qu[t].first)] - d + mndp[P(qu[t].second)] - d <= k) an[t] = true;
}
void pl(int v = 1, int p = 0) {
  dp[v] = dp[p] + 1;
  up[v][0] = p;
  int k = 1, z;
  while (k < B && (z = up[v][k - 1])) {
    up[v][k] = up[z][k - 1];
    ++k;
  }
  for (int u : tr[v])
    if (u != p) pl(u, v);
}
int lca(int a, int b) {
  if (dp[a] < dp[b]) swap(a, b);
  int d = dp[a] - dp[b], j = 0;
  while (d) {
    if (d & 1) a = up[a][j];
    ++j;
    d >>= 1;
  }
  if (a == b) return a;
  for (int i = B - 1; i >= 0; --i)
    if (up[a][i] != up[b][i]) a = up[a][i], b = up[b][i];
  return up[a][0];
}
int main() {
  scanf("%d%d%d", &n, &k, &r);
  for (int i = 1; i < (int)(n); ++i) {
    int a, b;
    scanf("%d%d", &a, &b);
    tr[a].push_back(b);
    tr[b].push_back(a);
  }
  for (int i = 0; i < (int)(r); ++i) {
    int t;
    scanf("%d", &t);
    sp[t] = true;
  }
  pl();
  int q;
  scanf("%d", &q);
  for (int i = 0; i < (int)(q); ++i) {
    int a, b;
    scanf("%d%d", &a, &b);
    qu[i] = make_pair(a, b);
    qv[lca(a, b)].push_back(i);
  }
  go();
  for (int i = 0; i < (int)(q); ++i)
    if (P(qu[i].first) == P(qu[i].second)) an[i] = true;
  for (int i = 0; i < (int)(q); ++i) printf("%s\n", an[i] ? "YES" : "NO");
}
