#include <bits/stdc++.h>
using namespace std;
inline int rd() {
  char ch = getchar();
  int i = 0, f = 1;
  while (!isdigit(ch)) {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    i = (i << 1) + (i << 3) + ch - '0';
    ch = getchar();
  }
  return i * f;
}
const int N = 2e5 + 50, INF = 0x3f3f3f3f;
int n, col[N], fa[N];
int d1[N];
int d2[N];
int d3[N];
int d4[N];
int d5[N];
int d6[N];
vector<int> edge[N];
inline void dfs1(int x, int f) {
  fa[x] = f;
  if ((x != 1 && edge[x].size() == 1) || (x == 1 && !edge[x].size())) {
    d1[x] = 0;
    d3[x] = (col[x] ? 0 : INF);
    return;
  }
  int mx = 0, mx2 = INF;
  for (auto v : edge[x]) {
    if (v == f) continue;
    dfs1(v, x);
    mx = max(mx, d1[v]);
    if (d3[v] < INF) mx2 = min(mx2, d1[v]);
  }
  d1[x] = mx + 1;
  d3[x] = mx2 + 1;
  if (col[x]) d3[x] = min(d3[x], d1[x]);
}
inline void dfs2(int x, int f) {
  d2[x] = max(d2[x], (f != 0) + d2[f]);
  d4[x] = max(d4[x], ((f != 0) ? 1 : INF) + d4[f]);
  if (f) d5[x] = max(d5[x], d2[x] - 1);
  if (f && col[f]) d4[x] = min(d4[x], d2[x]);
  int mx, mx2;
  mx = -1;
  mx2 = d4[x];
  for (int e = 0; e < edge[x].size(); ++e) {
    int v = edge[x][e];
    if (v == f) continue;
    d2[v] = max(d2[v], mx + 2);
    d6[v] = max(d6[v], mx2);
    d5[v] = max(d5[v], mx + 1);
    mx = max(mx, d1[v]);
    mx2 = max(mx2, d3[v] + 1);
  }
  mx = -1;
  mx2 = d4[x];
  for (int e = edge[x].size() - 1; e >= 0; e--) {
    int v = edge[x][e];
    if (v == f) continue;
    d2[v] = max(d2[v], mx + 2);
    d4[v] = min(d4[v], max(d6[v], mx2) + 1);
    d5[v] = max(d5[v], mx + 1);
    mx = max(mx, d1[v]);
    mx2 = max(mx2, d3[v] + 1);
  }
  for (auto v : edge[x])
    if (v != f) dfs2(v, x);
}
int main() {
  n = rd();
  memset(d3, 0x3f, sizeof(d3));
  memset(d4, 0x3f, sizeof(d4));
  for (int i = 1; i < n; i++) {
    int x = rd(), y = rd();
    edge[x].push_back(y);
    edge[y].push_back(x);
  }
  string s;
  cin >> s;
  int bz = 0;
  for (int i = 0; i < n; i++) col[i + 1] = s[i] - '0', bz |= col[i + 1];
  if (!bz) {
    puts("0");
    return 0;
  }
  dfs1(1, 0);
  dfs2(1, 0);
  long long ans = 0;
  for (int i = 1; i <= n; i++) {
    if (col[i])
      d6[i] = 0;
    else
      d6[i] = min(d3[i], d4[i]);
    int u = max(d1[i], d2[i]) - 1;
    for (auto v : edge[i]) {
      if (v == fa[i])
        u = min(u, d1[i] + 1);
      else
        u = min(u, d5[v] + 1);
    }
    if (u >= d6[i]) ans = ans + u - d6[i] + 1;
  }
  cout << ans + 1;
}
