#include <bits/stdc++.h>
using namespace std;
int IN() {
  int c, f, x;
  while (!isdigit(c = getchar()) && c != '-')
    ;
  c == '-' ? (f = 1, x = 0) : (f = 0, x = c - '0');
  while (isdigit(c = getchar())) x = (x << 1) + (x << 3) + c - '0';
  return !f ? x : -x;
}
const int N = 200000 + 19;
const int oo = (1 << 30) - 1;
struct Edge {
  int y, nxt;
} E[N * 2];
vector<int> V[N];
int D[N], U[N], top[N], low[N];
int n;
char s[N];
long long ans;
void Link(int x, int y) {
  V[x].push_back(y);
  V[y].push_back(x);
}
void dfs(int x, int fa) {
  int y;
  for (int i = 0; i < V[x].size(); i++)
    if ((y = V[x][i]) != fa) {
      dfs(y, x);
      D[x] = max(D[x], D[y] + 1);
    }
}
void dfs2(int x, int fa) {
  int mx = U[x], y;
  for (int y : V[x])
    if (y != fa) {
      U[y] = max(U[y], mx + 1);
      mx = max(mx, D[y] + 1);
    }
  mx = U[x];
  for (int i = int(V[x].size()) - 1; ~i; i--)
    if ((y = V[x][i]) != fa) {
      U[y] = max(U[y], mx + 1);
      mx = max(mx, D[y] + 1);
    }
  for (int y : V[x])
    if (y != fa) dfs2(y, x);
}
void calc(int x, int fa) {
  vector<int> T;
  top[x] = max(D[x], U[x]) - 1;
  low[x] = n;
  T.push_back(-1);
  if (~fa) {
    T.push_back(U[x] - 1);
    low[x] = min(low[x], U[x]);
  }
  for (int y : V[x])
    if (y != fa) {
      T.push_back(D[y]);
      low[x] = min(low[x], D[y] + 1);
      calc(y, x);
    }
  sort(T.begin(), T.end(), greater<int>());
  top[x] = min(top[x], T[1] + 2);
}
int main() {
  n = IN();
  for (int i = 1; i < n; i++) Link(IN(), IN());
  scanf("%s", s + 1);
  if (n == 1) {
    puts("1");
    return 0;
  }
  dfs(1, -1);
  dfs2(1, -1);
  calc(1, -1);
  for (int i = 1; i < n + 1; i++)
    if (s[i] == '1') {
      ans += max(top[i] + 1, 0);
    } else {
      ans += max(top[i] - max(low[i], 1) + 1, 0);
    }
  ans++;
  cout << ans << endl;
}
