#include <bits/stdc++.h>
using namespace std;
long long read() {
  char ch = getchar();
  long long x = 0, ff = 1;
  while (ch < '0' || ch > '9') {
    if (ch == '-') ff = -ff;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  return x * ff;
}
void write(long long aa) {
  if (aa < 0) putchar('-'), aa = -aa;
  if (aa > 9) write(aa / 10);
  putchar(aa % 10 + '0');
  return;
}
int n, ans;
int tot, head[200005], nx[400005], to[400005];
int dep[200005][3], sz[200005];
char s[200005];
void jia(int aa, int bb) {
  tot++;
  nx[tot] = head[aa];
  to[tot] = bb;
  head[aa] = tot;
  return;
}
void dfs(int rt, int fa) {
  if (s[rt] == '1') sz[rt] = 1;
  dep[rt][0] = dep[rt][0] = 0;
  dep[rt][2] = n + 1;
  for (int i = head[rt]; i; i = nx[i]) {
    int yy = to[i];
    if (yy == fa) continue;
    dfs(yy, rt);
    sz[rt] += sz[yy];
    int qwq = dep[yy][0] + 1;
    if (qwq > dep[rt][0])
      dep[rt][1] = dep[rt][0], dep[rt][0] = qwq;
    else if (qwq > dep[rt][1])
      dep[rt][1] = qwq;
    if (sz[yy]) dep[rt][2] = min(dep[rt][2], qwq);
  }
  return;
}
void getans(int rt, int fa, int DD) {
  int mx = max(dep[rt][0], DD), mn = dep[rt][1], alb = dep[rt][2];
  if (DD == mx)
    mn = dep[rt][0];
  else
    mn = max(mn, DD);
  if (sz[1] - sz[rt]) alb = min(alb, DD);
  if (s[rt] == '1')
    ans += mn + 1;
  else if (mn)
    ans += mn - alb + 1;
  for (int i = head[rt]; i; i = nx[i]) {
    int yy = to[i];
    if (yy == fa) continue;
    int wzp = dep[rt][1] + 1;
    if (dep[yy][0] + 1 != dep[rt][0]) wzp = dep[rt][0] + 1;
    if (max(DD + 1, wzp) > dep[yy][0] + 1 && sz[yy])
      ans++;
    else if (max(DD + 1, wzp) < dep[yy][0] + 1 && sz[1] - sz[yy])
      ans++;
    else if (max(DD + 1, wzp) == dep[yy][0] + 1)
      ans++;
    getans(yy, rt, max(DD + 1, wzp));
  }
  return;
}
int main() {
  n = read();
  for (int i = 1; i < n; ++i) {
    int x = read(), y = read();
    jia(x, y);
    jia(y, x);
  }
  scanf("%s", s + 1);
  dfs(1, 1);
  getans(1, 1, 0);
  write(ans);
  return 0;
}
