#include <bits/stdc++.h>
using namespace std;
const int N = 4e5 + 100;
int gi() {
  int w = 0;
  bool q = 1;
  char c = getchar();
  while ((c < '0' || c > '9') && c != '-') c = getchar();
  if (c == '-') q = 0, c = getchar();
  while (c >= '0' && c <= '9') w = w * 10 + c - '0', c = getchar();
  return q ? w : -w;
}
int head[N], nxt[N], to[N], fa[N];
int sum[N], all;
bool is[N];
int ans;
int one[N], two[N];
inline void dfs1(int k) {
  sum[k] = is[k];
  for (int i = head[k]; i; i = nxt[i])
    if (to[i] != fa[k]) {
      fa[to[i]] = k;
      dfs1(to[i]);
      if (one[to[i]] + 1 > one[k])
        two[k] = one[k], one[k] = one[to[i]] + 1;
      else
        two[k] = max(two[k], one[to[i]] + 1);
      sum[k] += sum[to[i]];
    }
}
inline void dfs2(int k, int mx) {
  int l = all - sum[k] ? mx : 1 << 30, r, i, One = mx, Two = 0;
  for (i = head[k]; i; i = nxt[i])
    if (to[i] != fa[k]) {
      if (one[to[i]] + 1 > One)
        Two = One, One = one[to[i]] + 1;
      else
        Two = max(Two, one[to[i]] + 1);
      if (sum[to[i]]) l = min(l, one[to[i]] + 1);
    }
  r = One == Two ? One - 1 : (One == Two + 1 ? Two : Two + 1);
  if (is[k])
    ans += r + 1;
  else if (l <= r)
    ans += r - l + 1;
  for (i = head[k]; i; i = nxt[i])
    if (to[i] != fa[k]) dfs2(to[i], (one[to[i]] + 1 == One ? Two : One) + 1);
}
int main() {
  int n = gi(), i, a, b, tot = 0;
  char c;
  for (i = 1; i < n; i++) {
    a = gi(), b = gi();
    to[++tot] = b, nxt[tot] = head[a], head[a] = tot;
    to[++tot] = a, nxt[tot] = head[b], head[b] = tot;
  }
  for (i = 1; i <= n; all += is[i++] = c - '0')
    while ((c = getchar()) < '0' || '9' < c)
      ;
  dfs1(1);
  dfs2(1, 0);
  cout << ans + 1 << endl;
  return 0;
}
