#include <bits/stdc++.h>
using namespace std;
mt19937_64 mt(chrono::steady_clock::now().time_since_epoch().count());
inline long long S(int n, int i = 1, int d = 1) {
  return n & 1 ? (2 * i + d * (n - 1)) / 2 * n : n / 2 * (2 * i + d * (n - 1));
}
inline string ctos(char c) { return string(1, c); }
const int SEED = 1e9 + 7 + 7e7;
const int SIZE = 4e5 + 17;
const int M = 1000001917;
const int LOG = 20;
vector<int> gr[SIZE];
bool rest[SIZE], used[SIZE];
pair<int, int> plan[SIZE];
int dst[SIZE], dsu[SIZE], depth[SIZE], par[LOG][SIZE];
int Find(int v) {
  if (dsu[v] == v) return v;
  return dsu[v] = Find(dsu[v]);
}
inline void DsuUnite(int x, int y) {
  x = Find(x), y = Find(y);
  if (rand() & 1) swap(x, y);
  dsu[x] = y;
}
void dfs(int v) {
  for (int u : gr[v]) {
    gr[u].erase(find(gr[u].begin(), gr[u].end(), v));
    par[0][u] = v;
    depth[u] = depth[v] + 1;
  }
  for (int i = 1; i < LOG; i++) par[i][v] = par[i - 1][par[i - 1][v]];
  for (int u : gr[v]) dfs(u);
}
inline int la(int v, int len) {
  for (int i = LOG - 1 - 1; i >= 0; i--) {
    if (len & (1 << i)) {
      v = par[i][v];
    }
  }
  return v;
}
inline int lca(int v, int u) {
  if (depth[v] < depth[u]) swap(v, u);
  v = la(v, depth[v] - depth[u]);
  if (v == u) return v;
  for (int i = LOG - 1 - 1; i >= 0; i--) {
    if (par[i][v] != par[i][u]) {
      v = par[i][v];
      u = par[i][u];
    }
  }
  return par[0][v];
}
inline int walk(int a, int b, int k) {
  int c = lca(a, b);
  if (depth[a] - depth[c] >= k) return la(a, k);
  int ost = k - depth[a] + depth[c];
  return la(b, depth[b] - depth[c] - ost);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n, k, r, x, y, v, oldN;
  cin >> n >> k >> r;
  oldN = n;
  for (int i = 0; i < n * 2; i++) dsu[i] = i;
  for (int i = 0; i < n - 1; i++) {
    cin >> x >> y;
    x--;
    y--;
    gr[x].push_back(oldN);
    gr[oldN].push_back(x);
    gr[oldN].push_back(y);
    gr[y].push_back(oldN);
    oldN++;
  }
  for (int i = 0; i < r; i++) {
    cin >> x;
    rest[--x] = true;
  }
  cin >> v;
  for (int i = 0; i < v; i++) cin >> plan[i].first >> plan[i].second;
  queue<pair<int, int>> q;
  for (int i = 0; i < n; i++)
    if (rest[i]) q.push(make_pair(i, 0));
  while (!q.empty()) {
    int u = q.front().first;
    dst[u] = q.front().second;
    q.pop();
    used[u] = true;
    if (dst[u] == k) continue;
    for (int t : gr[u]) {
      if (!used[t] && dst[u] + 1 <= k) {
        used[t] = true;
        dst[t] = dst[u] + 1;
        q.push(make_pair(t, dst[t]));
      }
      DsuUnite(u, t);
    }
  }
  dfs(0);
  for (int i = 0; i < v; i++) {
    auto pl = plan[i];
    bool cor = Find(--pl.first) == Find(--pl.second);
    if (!cor) {
      int l = lca(pl.first, pl.second);
      if (depth[pl.first] + depth[pl.second] - 2 * depth[l] <= k * 2)
        cor = true;
      else {
        int a = pl.first, b = pl.second;
        cor = (Find(walk(a, b, k)) == Find(walk(b, a, k)));
      }
    }
    cout << (cor ? "YES" : "NO") << endl;
  }
}
