#include <bits/stdc++.h>
using namespace std;
int n, m, d, p, a, b, resp;
int afetado[112345], dp[112345][3], foi[112345];
vector<int> grafo[112345];
void dfs_filho(int v) {
  foi[v] = 1;
  if (afetado[v] == 1) {
    if (dp[v][0] < 0) {
      dp[v][1] = v;
      dp[v][0] = 0;
    } else if (dp[v][2] < 0) {
      dp[v][2] = 0;
    }
  }
  for (int i = 0; i < grafo[v].size(); i++) {
    int viz = grafo[v][i];
    if (foi[viz] == 0) {
      dfs_filho(viz);
      if (dp[viz][0] + 1 > dp[v][0] && dp[viz][0] != -1) {
        dp[v][2] = dp[v][0];
        dp[v][0] = dp[viz][0] + 1;
        dp[v][1] = viz;
      } else {
        if (dp[viz][0] + 1 > dp[v][2] && dp[viz][0] != -1) {
          dp[v][2] = dp[viz][0] + 1;
        }
      }
    }
  }
}
void dfs_pai(int v, int pai) {
  foi[v] = 1;
  if (v != pai) {
    int dpai = -1;
    if (dp[pai][1] == v) {
      if (dp[pai][2] > -1) {
        dpai = dp[pai][2] + 1;
      }
    } else if (dp[pai][0] > -1) {
      dpai = dp[pai][0] + 1;
    }
    if (dpai > dp[v][0] && dpai != -1) {
      dp[v][2] = dp[v][0];
      dp[v][0] = dpai;
      dp[v][1] = pai;
    } else if (dpai > dp[v][2] && dpai != -1) {
      dp[v][2] = dpai;
    }
  }
  for (int i = 0; i < grafo[v].size(); i++) {
    int viz = grafo[v][i];
    if (foi[viz] == 0) {
      dfs_pai(viz, v);
    }
  }
}
int main() {
  scanf("%d %d %d", &n, &m, &d);
  for (int i = 0; i < m; i++) {
    scanf("%d", &p);
    afetado[p] = 1;
  }
  for (int i = 0; i < n - 1; i++) {
    scanf("%d %d", &a, &b);
    grafo[a].push_back(b);
    grafo[b].push_back(a);
  }
  for (int i = 1; i <= n; i++) {
    foi[i] = 0;
    dp[i][0] = -1;
    dp[i][1] = 0;
    dp[i][2] = -1;
  }
  dfs_filho(1);
  for (int i = 1; i <= n; i++) {
    foi[i] = 0;
  }
  dfs_pai(1, 1);
  for (int i = 1; i <= n; i++) {
    if (dp[i][0] <= d) {
      resp++;
    }
  }
  printf("%d\n", resp);
}
