#include <bits/stdc++.h>
using namespace std;
const int maxn = 200005;
int ehead[maxn], ecnt;
struct edge {
  int u, v, next;
} edg[maxn << 1];
void add(int u, int v) {
  edg[++ecnt] = (edge){u, v, ehead[u]};
  ehead[u] = ecnt;
  edg[++ecnt] = (edge){v, u, ehead[v]};
  ehead[v] = ecnt;
}
char s[maxn];
int n, low[maxn], high[maxn];
long long ans;
int fa[maxn], f[maxn], g[maxn], stk[maxn], top, pos[maxn], idx;
int pre[maxn], suf[maxn], lowf[maxn], d[maxn];
void upd(int &x, int y) { x < y ? x = y : 0; }
void dnd(int &x, int y) { x > y ? x = y : 0; }
void dfs(int u) {
  low[u] = lowf[u] = 1 << 29;
  pos[++idx] = u;
  if (s[u] == '1') low[u] = 0;
  for (int v, j = ehead[u]; j; j = edg[j].next)
    if ((v = edg[j].v) != fa[u]) {
      fa[v] = u;
      dfs(v);
      f[u] = max(f[u], f[v] + 1);
      low[u] = min(low[u], max(low[v] - 1, f[v] + 1));
    }
}
void solve(int u) {
  int mx1 = 0, mx2 = 0, cur;
  top = 0;
  g[u] > mx1 ? (mx2 = mx1, mx1 = g[u]) : (g[u] > mx2 ? mx2 = g[u] : 0);
  for (int v, j = ehead[u]; j; j = edg[j].next)
    if ((v = edg[j].v) != fa[u]) stk[++top] = v;
  pre[0] = suf[top + 1] = g[u];
  for (int i = 1; i <= top; i++) pre[i] = max(pre[i - 1], f[stk[i]] + 1);
  for (int i = top; i >= 1; i--) suf[i] = max(suf[i + 1], f[stk[i]] + 1);
  for (int i = 1; i <= top; i++) d[i] = max(pre[i - 1], suf[i + 1]);
  cur = lowf[u];
  for (int i = 1; i <= top; i++) {
    int v = stk[i], res = f[v] + 1, dis = d[i];
    int w = max(f[v] + 1, low[v] - 1);
    res > mx1 ? (mx2 = mx1, mx1 = res) : (res > mx2 ? mx2 = res : 0);
    upd(g[v], dis + 1);
    dnd(lowf[v], max(cur - 1, dis + 1));
    dnd(cur, w);
  }
  cur = lowf[u];
  for (int i = top; i >= 1; i--) {
    int v = stk[i], dis = d[i];
    int w = max(f[v] + 1, low[v] - 1);
    dnd(lowf[v], max(cur - 1, dis + 1));
    dnd(cur, w);
  }
  low[u] = min(low[u], lowf[u]);
  high[u] = min(mx1 - 1, mx2 + 1);
}
int main() {
  scanf("%d", &n);
  for (int u, v, i = 1; i < n; i++) scanf("%d %d", &u, &v), add(u, v);
  scanf("%s", s + 1);
  dfs(1);
  for (int i = 1; i <= n; i++) solve(pos[i]);
  for (int i = 1; i <= n; i++) ans += max(0, high[i] - low[i] + 1);
  printf("%lld", ans + 1);
  return 0;
}
