#include <bits/stdc++.h>
void mins(int& a, int b) {
  if (a > b) a = b;
}
int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }
void upd(int& a, int& b, int c) {
  if (c >= a)
    b = a, a = c;
  else if (c > b)
    b = c;
}
const int N = 2e5 + 7;
long long ans = 1;
int n;
char s[N];
struct edge {
  int to;
  edge* nx;
} e[N * 2], *ep = e;
edge* e0[N];
int d1[N], d2[N], d3[N], d4[N], sz[N];
void f1(int w, int pa) {
  sz[w] = s[w] - '0';
  for (edge* i = e0[w]; i; i = i->nx) {
    int u = i->to;
    if (u == pa) continue;
    f1(u, w);
    if (sz[u]) {
      sz[w] += sz[u];
      mins(d4[w], d1[u] + 1);
    }
    upd(d1[w], d2[w], d1[u] + 1);
  }
}
void f2(int w, int pa) {
  for (edge* i = e0[w]; i; i = i->nx) {
    int u = i->to;
    if (u == pa) continue;
    int d = max(d3[w], d1[w] == d2[w] + 1 ? d2[w] : d1[w]) + 1;
    if (sz[u] != sz[1]) mins(d4[u], d);
    d3[u] = d;
    f2(u, w);
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 1, a, b; i < n; ++i) {
    scanf("%d%d", &a, &b);
    *ep = (edge){b, e0[a]};
    e0[a] = ep++;
    *ep = (edge){a, e0[b]};
    e0[b] = ep++;
  }
  scanf("%s", s + 1);
  for (int i = 1; i <= n; ++i)
    if (s[i] == '0') d4[i] = N;
  f1(1, 0);
  f2(1, 0);
  for (int i = 1; i <= n; ++i) {
    upd(d1[i], d2[i], d3[i]);
    ans += max(0, min(d1[i] - 1, d2[i] + 1) - d4[i] + 1);
  }
  printf("%lld\n", ans);
  return 0;
}
