#include <bits/stdc++.h>
using namespace std;
struct node {
  int to;
  node *nxt;
} edges[200000 * 2 + 5];
node *ncnt = &edges[0], *Adj[200000 + 5];
int n, sum, siz[200000 + 5], mx[200000 + 5], smx[200000 + 5];
int l[200000 + 5], r[200000 + 5];
long long ans = 0;
char str[200000 + 5];
void AddEdge(int u, int v) {
  node *p = ++ncnt;
  p->to = v;
  p->nxt = Adj[u];
  Adj[u] = p;
  node *q = ++ncnt;
  q->to = u;
  q->nxt = Adj[v];
  Adj[v] = q;
}
void DFS1(int u, int fa) {
  siz[u] = str[u] - '0';
  for (node *p = Adj[u]; p != NULL; p = p->nxt) {
    int v = p->to;
    if (v == fa) continue;
    DFS1(v, u);
    siz[u] += siz[v];
    if (mx[v] + 1 > mx[u])
      smx[u] = mx[u], mx[u] = mx[v] + 1;
    else if (mx[v] + 1 > smx[u])
      smx[u] = mx[v] + 1;
  }
}
void DFS2(int u, int fa, int len) {
  r[u] = (len > mx[u] ? mx[u] : max(len, smx[u])) + 1;
  r[u] = min(r[u], max(mx[u], len) - 1);
  l[u] = str[u] - '0' ? 0 : (sum - siz[u] ? len : 200000 + 5);
  if (fa != -1) {
    if (len - 1 == mx[u])
      ans++;
    else if (len - 1 < mx[u])
      ans += siz[u] < sum;
    else
      ans += siz[u] > 0;
  }
  for (node *p = Adj[u]; p != NULL; p = p->nxt) {
    int v = p->to;
    if (v == fa) continue;
    if (siz[v]) l[u] = min(l[u], mx[v] + 1);
    if (mx[u] == mx[v] + 1)
      DFS2(v, u, max(len, smx[u]) + 1);
    else
      DFS2(v, u, max(len, mx[u]) + 1);
  }
}
int main() {
  scanf("%d", &n);
  int u, v;
  for (int i = 1; i < n; i++) {
    scanf("%d %d", &u, &v);
    AddEdge(u, v);
  }
  scanf("%s", str + 1);
  for (int i = 1; i <= n; i++) sum += str[i] - '0';
  DFS1(1, -1);
  DFS2(1, -1, 0);
  for (int i = 1; i <= n; i++)
    if (l[i] <= r[i]) ans += r[i] - l[i] + 1;
  ans++;
  printf("%lld\n", ans);
  return 0;
}
