#include <bits/stdc++.h>
using namespace std;
int F() {
  char ch;
  int x, a;
  while (ch = getchar(), (ch < '0' || ch > '9') && ch != '-')
    ;
  if (ch == '-')
    ch = getchar(), a = -1;
  else
    a = 1;
  x = ch - '0';
  while (ch = getchar(), ch >= '0' && ch <= '9')
    x = (x << 1) + (x << 3) + ch - '0';
  return a * x;
}
const int N = 2e5 + 10;
vector<int> edge[N];
char str[N];
int n, in[N], out[N], dfs_clock, fa[N], dep[N], d[N];
void dfs1(int u) {
  in[u] = ++dfs_clock;
  for (auto v : edge[u]) {
    if (v == fa[u]) continue;
    fa[v] = u;
    dep[v] = dep[u] + 1;
    dfs1(v);
  }
  out[u] = dfs_clock;
}
struct node {
  int l, r;
  int val, tag;
  void add(int x) {
    val += x;
    tag += x;
  }
} t[N << 2];
void push_up(int o) { t[o].val = max(t[o << 1].val, t[o << 1 | 1].val); }
void push_down(int o) {
  if (t[o].tag) {
    t[o << 1].add(t[o].tag);
    t[o << 1 | 1].add(t[o].tag);
    t[o].tag = 0;
  }
}
void build(int o, int l, int r) {
  t[o].l = l, t[o].r = r;
  if (l == r) {
    t[o].val = d[l];
    return;
  }
  int mid = (l + r) >> 1;
  build(o << 1, l, mid);
  build(o << 1 | 1, mid + 1, r);
  push_up(o);
}
int query(int o, int l, int r) {
  if (t[o].r < l || r < t[o].l) return 0;
  if (l <= t[o].l && t[o].r <= r) return t[o].val;
  push_down(o);
  return max(query(o << 1, l, r), query(o << 1 | 1, l, r));
}
void add(int o, int l, int r, int x) {
  if (t[o].r < l || r < t[o].l) return;
  if (l <= t[o].l && t[o].r <= r) return t[o].add(x);
  push_down(o);
  add(o << 1, l, r, x);
  add(o << 1 | 1, l, r, x);
  push_up(o);
}
int mxt[N];
void dfs2(int u) {
  int a = max(query(1, in[u], out[u]), (int)!!fa[u]) + 1;
  int b = 0;
  mxt[u] = max(a, b);
  for (auto v : edge[u]) {
    if (v == fa[u]) continue;
    add(1, in[v], out[v], -1);
    add(1, 1, in[v] - 1, 1);
    add(1, out[v] + 1, n, 1);
    dfs2(v);
    add(1, in[v], out[v], 1);
    add(1, 1, in[v] - 1, -1);
    add(1, out[v] + 1, n, -1);
  }
}
int main() {
  ((n) = F());
  for (int i = 1; i < n; ++i) {
    int u, v;
    (((u) = F()), ((v) = F()));
    edge[u].push_back(v);
    edge[v].push_back(u);
  }
  scanf("%s", str + 1);
  dfs1(1);
  for (int i = 1; i <= n; ++i) d[in[i]] = dep[i];
  build(1, 1, n);
  dfs2(1);
  long long ans = 0;
  for (int i = 1; i <= n; ++i) ans += mxt[i];
  printf("%lld\n", ans);
  return 0;
}
