#include <bits/stdc++.h>
using namespace std;
const int N = 200010;
char Read() {
  char c = getchar();
  while (c < '0' || c > '1') c = getchar();
  return c;
}
int read() {
  char c = getchar();
  int d = 0, f = 1;
  for (; c < '0' || c > '9'; c = getchar())
    if (c == '-') f = -1;
  for (; c >= '0' && c <= '9'; d = d * 10 + c - 48, c = getchar())
    ;
  return d * f;
}
int n, ans, s[N], w[N], dep[N], Dep[N], g[N][2];
vector<int> e[N];
void add(int x, int y) {
  e[x].push_back(y);
  e[y].push_back(x);
}
void dfs1(int f, int x) {
  for (int i = 0; i <= ((int)e[x].size()) - 1; ++i) {
    int y = e[x][i];
    if (y == f) continue;
    dfs1(x, y);
    dep[x] = max(dep[x], dep[y]);
    s[x] |= s[y];
  }
  dep[x]++;
  s[x] |= w[x];
}
void dfs2(int f, int x) {
  int &D1 = g[x][0], &D2 = g[x][1];
  D1 = Dep[x];
  D2 = 0;
  int mi = N;
  if (s[1] - s[x] > 0) mi = Dep[x];
  for (int i = 0; i <= ((int)e[x].size()) - 1; ++i) {
    int y = e[x][i];
    if (y == f) continue;
    if (s[y]) mi = min(mi, dep[y]);
    if (dep[y] > D1)
      D2 = D1, D1 = dep[y];
    else if (dep[y] > D2)
      D2 = dep[y];
  }
  for (int i = 0; i <= ((int)e[x].size()) - 1; ++i) {
    int y = e[x][i];
    if (y == f) continue;
    if (dep[y] == D1)
      Dep[y] = D2 + 1;
    else
      Dep[y] = D1 + 1;
    dfs2(x, y);
  }
  if (w[x])
    ans += min(D1, D2) + 1;
  else
    ans += max(0, min(D1, D2) - mi + 1);
  if (x > 1) {
    if (dep[x] <= Dep[x] && s[x] > 0 || Dep[x] <= dep[x] && s[1] - s[x] > 0)
      ans++;
  }
}
int main() {
  n = read();
  for (int i = 2; i <= n; ++i) add(read(), read());
  for (int i = 1; i <= n; ++i) w[i] = Read() - '0';
  dfs1(0, 1);
  dfs2(0, 1);
  cout << ans << endl;
}
