#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
const int INF = 0x3f3f3f3f;
int n;
char s[N];
int c[N];
int fa[N], sz[N];
int d1[N];
int d2[N];
int d3[N];
int d4[N];
int d5[N];
int d6[N];
int d7[N];
struct node {
  int u, v, nxt;
} edge[N];
int head[N], mcnt;
int du[N];
void add_edge(int u, int v) {
  mcnt++;
  du[u]++;
  edge[mcnt].u = u;
  edge[mcnt].v = v;
  edge[mcnt].nxt = head[u];
  head[u] = mcnt;
}
void dfs1(int u) {
  sz[u] = c[u];
  if ((u != 1 && du[u] == 1) || (u == 1 && du[u] == 0)) {
    d1[u] = 0;
    d3[u] = c[u] ? 0 : INF;
    return;
  }
  int mx = 0, mn = INF;
  for (int i = head[u]; i; i = edge[i].nxt) {
    int v = edge[i].v;
    if (v == fa[u]) continue;
    fa[v] = u;
    dfs1(v);
    sz[u] += sz[v];
    mx = max(mx, d1[v]);
    if (d3[v] < INF) mn = min(mn, d1[v]);
  }
  d1[u] = mx + 1;
  d3[u] = mn + 1;
  if (c[u]) d3[u] = min(d3[u], d1[u]);
}
void dfs2(int u) {
  if (u != 1) {
    d2[u] = max(d2[u], d2[fa[u]] + 1);
    d5[u] = max(d5[u], d2[u] - 1);
  }
  int mx;
  mx = -1;
  for (int i = head[u]; i; i = edge[i].nxt) {
    int v = edge[i].v;
    if (v == fa[u]) continue;
    mx = max(mx, d1[v]);
  }
  printf("%d:%d\n", u, mx);
  for (int i = head[u]; i; i = edge[i].nxt) {
    int v = edge[i].v;
    if (v == fa[u]) continue;
    d2[v] = max(d2[v], mx + 2);
  }
  for (int i = head[u]; i; i = edge[i].nxt) {
    int v = edge[i].v;
    if (v == fa[u]) continue;
    dfs2(v);
  }
}
int main() {
  scanf("%d", &n);
  memset(d3, 0x3f, sizeof d3);
  memset(d4, 0x3f, sizeof d4);
  for (int i = 1; i < n; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    add_edge(u, v);
    add_edge(v, u);
  }
  scanf("%s", s + 1);
  int z = 0;
  for (int i = 1; i <= n; i++) c[i] = s[i] - '0', z |= c[i];
  if (!z) {
    puts("0");
    return 0;
  }
  dfs1(1);
  dfs2(1);
  long long ans = 1;
  for (int i = 1; i <= n; i++) {
    if (c[i])
      d6[i] = 0;
    else {
      d6[i] = d3[i];
      if (sz[i] != sz[1]) d6[i] = min(d6[i], d2[i]);
    }
    d7[i] = max(d1[i], d2[i]) - 1;
    for (int j = head[i]; j; j = edge[j].nxt) {
      int v = edge[j].v;
      if (v == fa[i])
        d7[i] = min(d7[i], d1[i] + 1);
      else
        d7[i] = min(d7[i], d5[v] + 1);
    }
    if (d7[i] >= d6[i]) ans = ans + d7[i] - d6[i] + 1;
    printf("%d %d %d %d %d %d %d\n", d1[i], d2[i], d3[i], d4[i], d5[i], d6[i],
           d7[i]);
  }
  printf("%lld\n", ans);
}
