#include <bits/stdc++.h>
using namespace std;
function<void(void)> ____ = []() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
};
const int MAXN = 1e5 + 7;
int n, m, d, __count;
pair<int, int> f[MAXN][2];
bool tag[MAXN];
vector<int> G[MAXN];
void update(int u, int v, int w) {
  if (w == 0) return;
  if (w > f[u][0].first) {
    swap(f[u][0], f[u][1]);
    f[u][0] = make_pair(w, v);
  } else if (w > f[u][1].first)
    f[u][1] = make_pair(w, v);
}
void dfs(int u, int fa) {
  if (tag[u]) f[u][0] = make_pair(0, u);
  for (int v : G[u]) {
    if (v == fa) continue;
    dfs(v, u);
    update(u, v, f[v][0].first + 1);
  }
}
void rua(int u, int fa) {
  if (fa) {
    if (f[fa][0].second == u)
      update(u, fa, f[fa][1].first + 1);
    else
      update(u, fa, f[fa][0].first + 1);
  }
  if (f[u][0].first <= d) __count++;
  for (int v : G[u])
    if (v != fa) rua(v, u);
}
int main() {
  ____();
  cin >> n >> m >> d;
  for (int i = 1; i <= m; i++) {
    int pos;
    cin >> pos;
    tag[pos] = true;
  }
  for (int i = 1; i < n; i++) {
    int u, v;
    cin >> u >> v;
    G[u].push_back(v);
    G[v].push_back(u);
  }
  memset(f, 255, sizeof(f));
  dfs(1, 0);
  rua(1, 0);
  cout << __count << endl;
  return 0;
}
