#include <bits/stdc++.h>
using namespace std;
const int N = 4e5 + 10;
int n, w[N], head[N], nxt[N];
void add(int f, int t) {
  static int cnt = 0;
  w[++cnt] = t;
  nxt[cnt] = head[f];
  head[f] = cnt;
}
char tp[N];
long long ans;
int mp[N], cp[N], up[N];
void dfs(int x, int fa) {
  for (int i = head[x]; i; i = nxt[i]) {
    int v = w[i];
    if (v == fa) continue;
    dfs(v, x);
    if (up[v] > up[mp[x]])
      cp[x] = mp[x], mp[x] = v;
    else if (up[v] > up[cp[x]])
      cp[x] = v;
  }
  up[x] = up[mp[x]] + 1;
}
int Max[N];
void DFS(int x, int fa) {
  Max[x] = up[x];
  for (int i = head[x]; i; i = nxt[i]) {
    int v = w[i];
    if (v == fa) continue;
    up[x] = up[v == mp[x] ? cp[x] : mp[x]] + 1;
    ans += min(up[v] + 1, up[x]);
    if (up[x] > up[mp[v]])
      cp[v] = mp[v], mp[v] = x;
    else if (up[x] > up[cp[v]])
      cp[v] = x;
    up[v] = up[mp[v]] + 1;
    DFS(v, x);
    up[v] = up[x == mp[v] ? cp[v] : mp[v]] + 1;
    up[x] = up[mp[x]] + 1;
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    add(u, v);
    add(v, u);
  }
  scanf("%s", tp + 1);
  dfs(1, 0);
  DFS(1, 0);
  printf("%lld\n", ans + Max[1]);
  return 0;
}
