#include <bits/stdc++.h>
using namespace std;
const int N = 200010;
inline void chkmax(int& x, int y) { x = x > y ? x : y; }
inline void chkmin(int& x, int y) { x = x < y ? x : y; }
struct Info {
  int Mx, x;
  Info() { Mx = x = 0; }
  void update(int v) {
    if (v > Mx)
      x = Mx, Mx = v;
    else if (v > x)
      x = v;
  }
  int query(int v) { return v == Mx ? x : Mx; }
};
Info Maxd[N];
int dep[N];
vector<int> G[N];
char S[N];
int n;
void DFS_init(int o, int f) {
  for (int v : G[o]) {
    if (v == f) continue;
    DFS_init(v, o);
    Maxd[o].update(dep[v] + 1);
  }
  dep[o] = Maxd[o].Mx;
}
long long ans = 1;
int Maxv[N];
void DFS_work(int o, int f) {
  ans += Maxd[o].Mx;
  for (int v : G[o]) {
    if (v == f) continue;
    int x = Maxd[o].query(dep[v] + 1), y = dep[v];
    int t = max(0, abs(x - y) - 1);
    ans -= t;
    Maxv[o] = max(Maxv[o], t), Maxv[v] = max(Maxv[v], t);
    Maxd[v].update(x + 1);
    DFS_work(v, o);
  }
  if (S[o] == '0') ans -= Maxd[o].Mx - Maxv[o];
}
int main() {
  scanf("%d", &n);
  for (int i = 2; i <= n; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    G[u].push_back(v), G[v].push_back(u);
  }
  scanf("%s", S + 1);
  DFS_init(1, 0);
  DFS_work(1, 0);
  printf("%lld\n", ans);
  return 0;
}
