#include <bits/stdc++.h>
using namespace std;
const int N = 200005, inf = 1047483647;
struct node {
  int y, next;
} a[N << 1];
long long an;
int fa[N], d1[N], d2[N], C[N], d3[N], d4[N], d5[N], head[N], i, j, k, n, m, z,
    Z;
bool p[N];
char c;
inline char getc() {
  static char s[10000000], *l = s, *r = s;
  if (l == r) l = s, r = s + fread(s, 1, 10000000, stdin);
  return l == r ? 0 : *l++;
}
int read() {
  int z = 0;
  do c = getc();
  while (c < '0' || c > '9');
  while (c >= '0' && c <= '9') z *= 10, z += c - '0', c = getc();
  return z;
}
void jb(int x, int y) {
  a[++k] = (node){y, head[x]}, head[x] = k, a[++k] = (node){x, head[y]},
  head[y] = k;
}
int dfs1(int w) {
  d4[w] = inf;
  for (register int j = head[w]; j; j = a[j].next) {
    int c = a[j].y;
    if (c != fa[w]) {
      fa[c] = w, z = dfs1(c) + 1;
      if (z > d1[w])
        d2[w] = d1[w], d1[w] = z, C[w] = c;
      else
        d2[w] = max(d2[w], z);
      d4[w] = min(d4[w], d4[c] + 1);
    }
  }
  if (p[w]) d4[w] = min(d4[w], d1[w]);
  return d1[w];
}
void dfs2(int w) {
  for (register int j = head[w]; j; j = a[j].next) {
    int c = a[j].y;
    if (c != fa[w])
      d3[c] = max(d3[w], C[w] == c ? d2[w] : d1[w]) + 1,
      d5[c] = min(d5[w], d4[w]) + 1, dfs2(c);
  }
}
int main() {
  n = read(), k = 1;
  for (i = 1; i < n; ++i) jb(read(), read());
  do c = getc();
  while (c < '0' || c > '1');
  i = 0;
  while (c >= '0' && c <= '1') p[++i] = c - '0', c = getc();
  dfs1(1), d5[1] = inf, dfs2(1);
  for (i = 1; i <= n; ++i) {
    z = max(d1[i], d3[i]) - 1;
    for (j = head[i]; j; j = a[j].next) {
      int c = a[j].y;
      z = min(z, (fa[c] == i ? (max(d3[i], C[i] == c ? d2[i] : d1[i]) + 1)
                             : d1[i]) +
                     1);
    }
    Z = p[i] ? 0 : min(d4[i], d5[i]);
    if (z >= Z) an += z - Z + 1;
  }
  printf("%lld\n", an + 1);
  return 0;
}
