#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline bool chkmin(T &x, T y) {
  return (y < x) ? (x = y, 1) : 0;
}
template <typename T>
inline bool chkmax(T &x, T y) {
  return (y > x) ? (x = y, 1) : 0;
}
inline int read() {
  int x;
  char c;
  int f = 1;
  while ((c = getchar()) != '-' && (c > '9' || c < '0'))
    ;
  if (c == '-') f = -1, c = getchar();
  x = c ^ '0';
  while ((c = getchar()) >= '0' && c <= '9')
    x = (x << 1) + (x << 3) + (c ^ '0');
  return x * f;
}
inline long long readll() {
  long long x;
  char c;
  int f = 1;
  while ((c = getchar()) != '-' && (c > '9' || c < '0'))
    ;
  if (c == '-') f = -1, c = getchar();
  x = c ^ '0';
  while ((c = getchar()) >= '0' && c <= '9')
    x = (x << 1ll) + (x << 3ll) + (c ^ '0');
  return x * f;
}
const int maxn = 2e5 + 10, inf = 0x3f3f3f3f;
int Begin[maxn], Next[maxn << 1], to[maxn << 1], e;
inline void add_edge(int x, int y) {
  to[++e] = y;
  Next[e] = Begin[x];
  Begin[x] = e;
}
int Md[maxn], g[maxn], Md1[maxn], g1[maxn];
int Up[maxn], Down[maxn];
char s[maxn];
void dfs1(int x, int ff) {
  Md1[x] = inf;
  for (int i = Begin[x]; i; i = Next[i])
    if (to[i] != ff) {
      dfs1(to[i], x);
      chkmax(Md[x], Md[to[i]] + 1);
      chkmin(Md1[x], Md1[to[i]] + 1);
    }
  if (s[x] == '1') chkmin(Md1[x], Md[x]);
}
void dfs2(int x, int ff) {
  int Max = 0, Sec = 0;
  Up[x] = max(g[x], Md[x]) - 1;
  Down[x] = min(Md1[x], g1[x]);
  if (s[x] == '1') Down[x] = 0;
  chkmin(Up[x], Md[x] + 1);
  for (int i = Begin[x]; i; i = Next[i])
    if (to[i] != ff) {
      if (Md[to[i]] + 1 > Max)
        Sec = Max, Max = Md[to[i]] + 1;
      else
        chkmax(Sec, Md[to[i]] + 1);
    }
  for (int i = Begin[x]; i; i = Next[i])
    if (to[i] != ff) {
      g[to[i]] = g[x];
      if (Md[to[i]] + 1 == Max)
        chkmax(g[to[i]], Sec);
      else
        chkmax(g[to[i]], Max);
      ++g[to[i]];
      if (s[x] == '1') chkmax(g1[to[i]], g[to[i]]);
      chkmin(Up[x], g[to[i]]);
    }
  Max = Sec = inf;
  for (int i = Begin[x]; i; i = Next[i])
    if (to[i] != ff) {
      if (Md1[to[i]] + 1 < Max)
        Sec = Max, Max = Md1[to[i]] + 1;
      else
        chkmin(Sec, Md1[to[i]] + 1);
    }
  for (int i = Begin[x]; i; i = Next[i])
    if (to[i] != ff) {
      g1[to[i]] = g1[x];
      if (Md1[to[i]] + 1 == Max)
        chkmin(g1[to[i]], Sec);
      else
        chkmin(g1[to[i]], Max);
      ++g1[to[i]];
    }
  for (int i = Begin[x]; i; i = Next[i])
    if (to[i] != ff) dfs2(to[i], x);
}
int main() {
  int n = read();
  for (register int i = 1, iend = n - 1; i <= iend; ++i) {
    int x = read(), y = read();
    add_edge(x, y), add_edge(y, x);
  }
  scanf("%s", s + 1);
  dfs1(1, 0), g1[1] = inf;
  dfs2(1, 0);
  long long ans = 1;
  for (register int i = 1, iend = n; i <= iend; ++i)
    if (Down[i] <= Up[i]) ans += Up[i] - Down[i] + 1;
  printf("%lld\n", ans);
  return 0;
}
