#include <bits/stdc++.h>
using namespace std;
struct Edge {
  int t, next;
  Edge() {}
  Edge(int a, int b) : t(a), next(b) {}
};
Edge e[400005];
int head[200005];
bool num[200005];
int dep[200005], dis[200005], size[200005], son[200005];
bool in[200005];
void dfs1(int x, int fa) {
  if (fa) son[x]++;
  size[x] = in[x] = num[x];
  dis[x] = (num[x]) ? 0 : 0x7fffffff;
  for (int i = head[x]; i; i = e[i].next)
    if (e[i].t != fa) {
      son[x]++;
      int u = e[i].t;
      dfs1(u, x);
      in[x] |= in[u];
      dep[x] = max(dep[x], dep[u] + 1);
      if (in[u]) dis[x] = min(dis[x], dep[u] + 1);
      size[x] += size[u];
    }
}
int up[200005], cnt;
long long ans;
void dfs2(int x, int fa) {
  ans += min(max(dep[x] - dis[x], 0), (son[x] == 1) ? 2 : 0x7fffffff);
  int max1 = up[x], max2 = 0;
  for (int i = head[x]; i; i = e[i].next)
    if (e[i].t != fa) {
      int u = e[i].t;
      if (dep[u] + 1 >= max1) {
        max2 = max1;
        max1 = dep[u] + 1;
      } else
        max2 = max(max2, dep[u] + 1);
    }
  for (int i = head[x]; i; i = e[i].next)
    if (e[i].t != fa) {
      int u = e[i].t;
      up[u] = (dep[u] + 1 == max1) ? max2 + 1 : max1 + 1;
      dep[u] = max(dep[u], up[u]);
      if (cnt - size[u]) dis[u] = min(dis[u], up[u]);
      dfs2(u, x);
    }
}
char s[200005];
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    e[2 * i - 1] = Edge(y, head[x]);
    head[x] = 2 * i - 1;
    e[2 * i] = Edge(x, head[y]);
    head[y] = 2 * i;
  }
  scanf("%s", s + 1);
  for (int i = 1; i <= n; i++) {
    num[i] = (s[i] == '1');
    cnt += num[i];
  }
  dfs1(1, 0);
  dfs2(1, 0);
  printf("%lld\n", ans + 1);
  return 0;
}
