#include <bits/stdc++.h>
using namespace std;
vector<int> nei[200005];
int n;
int lt3[200005];
int sz[200005], mx[200005];
long long ans = 0;
void precalc(int now, int lst) {
  if (lt3[now]) {
    sz[now]++;
  }
  for (int i = 0; i < nei[now].size(); i++) {
    if (nei[now][i] != lst) {
      precalc(nei[now][i], now);
      sz[now] += sz[nei[now][i]];
      mx[now] = max(mx[now], mx[nei[now][i]] + 1);
    }
  }
}
void dfs(int now, int lst, int mxx) {
  int mx1 = mxx, mx2 = 0;
  if (lt3[now]) {
    for (int i = 0; i < nei[now].size(); i++) {
      if (nei[now][i] != lst) {
        mx2 = max(mx2, mx[nei[now][i]] + 1);
        if (mx1 < mx2) {
          swap(mx1, mx2);
        }
      }
    }
    ans += min(mx1 - 1, mx2 + 1) + 1;
  } else {
    int l = 1e9;
    for (int i = 0; i < nei[now].size(); i++) {
      if (nei[now][i] != lst) {
        mx2 = max(mx2, mx[nei[now][i]] + 1);
        if (mx1 < mx2) {
          swap(mx1, mx2);
        }
        if (sz[nei[now][i]]) {
          l = min(l, mx[nei[now][i]] + 1);
        }
      }
    }
    ans += max(0, min(mx1 - 1, mx2 + 1) - l + 1);
  }
  for (int i = 0; i < nei[now].size(); i++) {
    if (nei[now][i] != lst) {
      dfs(nei[now][i], now, mx[nei[now][i]] == mx1 - 1 ? mx2 + 1 : mx1 + 1);
    }
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    nei[a].push_back(b);
    nei[b].push_back(a);
  }
  for (int i = 1; i <= n; i++) {
    scanf("%1d", lt3 + i);
  }
  precalc(1, 0);
  dfs(1, 0, 0);
  printf("%lld\n", ans + 1);
  return 0;
}
