#include <bits/stdc++.h>
using namespace std;
const long long INF = LLONG_MAX / 10;
const long long MOD = 1e9 + 7;
long long N;
string s;
vector<vector<long long> > G;
long long dist[200010];
bool fav[200010];
void dfs1(long long v, long long p) {
  fav[v] = s[v] == '1';
  for (long long u : G[v])
    if (u != p) {
      dfs1(u, v);
      dist[v] = max(dist[v], dist[u] + 1);
      fav[v] |= fav[u];
    }
}
long long ans;
void dfs2(long long v, long long p, long long d_p, bool f_p) {
  vector<tuple<long long, long long> > dc;
  long long minfdc = INF;
  long long cntf = s[v] == '1';
  for (long long u : G[v]) {
    if (u == p) {
      dc.emplace_back(d_p + 1, u);
      if (f_p) {
        cntf++;
        minfdc = min(minfdc, d_p + 1);
      }
    } else {
      dc.emplace_back(dist[u] + 1, u);
      if (fav[u]) {
        cntf++;
        minfdc = min(minfdc, dist[u] + 1);
      }
    }
  }
  sort(dc.rbegin(), dc.rend());
  if (dc.size() >= 2) {
    ans += max(0ll, (get<0>(dc[1])) + 1 - (s[v] == '1' ? 0 : minfdc));
  } else {
    ans += s[v] == '1';
  }
  if (p != -1) {
    if ((d_p <= dist[v] && f_p) || (d_p >= dist[v] && fav[v])) {
      ans++;
    }
  }
  for (long long u : G[v])
    if (u != p) {
      dfs2(u, v, get<0>(dc[get<1>(dc[0]) == u]), (cntf > fav[u]));
    }
}
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cin >> N;
  G.resize(N);
  for (long long i = 0; i < N - 1; i++) {
    long long a, b;
    cin >> a >> b;
    a--;
    b--;
    G[a].push_back(b);
    G[b].push_back(a);
  }
  cin >> s;
  dfs1(0, -1);
  dfs2(0, -1, 0, false);
  cout << ans << endl;
  return 0;
}
