#include <bits/stdc++.h>
using namespace std;
const int N = 200200;
int i, j, k, n, m, x, y, En, ch, ff;
long long ans;
char s[N];
int fg[N], h[N], dp[N];
struct edge {
  int s, n;
} E[N << 1];
void R(int &x) {
  ff = x = 0;
  ch = getchar();
  while (ch < '0' || '9' < ch) {
    if (ch == '-') ff = 1;
    ch = getchar();
  }
  while ('0' <= ch && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  if (ff) x = -x;
}
void E_add(int x, int y) {
  E[++En].s = y;
  E[En].n = h[x];
  h[x] = En;
  E[++En].s = x;
  E[En].n = h[y];
  h[y] = En;
}
void dfs1(int x, int F) {
  for (int k = h[x]; k; k = E[k].n)
    if (E[k].s != F) {
      dfs1(E[k].s, x);
      fg[x] |= fg[E[k].s];
      dp[x] = max(dp[x], dp[E[k].s] + 1);
    }
}
void dfs2(int x, int F, int Dp) {
  int i, k, ma1 = Dp, ma2 = -1, mi = n;
  if (s[x] == '1') mi = -1;
  for (k = h[x]; k; k = E[k].n)
    if (E[k].s != F) {
      if (fg[E[k].s]) mi = min(mi, dp[E[k].s]);
      if (dp[E[k].s] > ma1)
        ma2 = ma1, ma1 = dp[E[k].s];
      else
        ma2 = max(ma2, dp[E[k].s]);
    }
  ans += max(0, min(ma2 + 1, ma1 - 1) - mi + 1);
  vector<int> pre, suf;
  for (k = h[x]; k; k = E[k].n)
    if (E[k].s != F) {
      pre.push_back(dp[E[k].s]);
      suf.push_back(dp[E[k].s]);
    }
  for (k = 1; k < pre.size(); k++) pre[k] = max(pre[k], pre[k - 1]);
  for (k = suf.size() - 2; k >= 0; k--) suf[k] = max(suf[k], suf[k + 1]);
  i = -1;
  for (k = h[x]; k; k = E[k].n)
    if (E[k].s != F) {
      i++;
      int ma = Dp;
      if (i - 1 >= 0) ma = max(ma, pre[i - 1]);
      if (i + 1 < suf.size()) ma = max(ma, suf[i + 1]);
      dfs2(E[k].s, x, ma + 1);
    }
}
int main() {
  R(n);
  for (i = 1; i < n; i++) {
    R(x);
    R(y);
    E_add(x, y);
  }
  scanf("%s", s + 1);
  for (i = 1; i <= n; i++)
    if (s[i] == '1') fg[i] = 1;
  dfs1(1, 0);
  dfs2(1, 0, -1);
  printf("%lld\n", ans + 1);
}
