#include <bits/stdc++.h>
using namespace std;
char s[200000];
int a[200000][2][2];
int c[200000];
vector<int> v[200000];
void update(int x, int y, int d) {
  if (d > a[x][0][0]) {
    a[x][1][0] = a[x][0][0];
    a[x][1][1] = a[x][0][1];
    a[x][0][0] = d;
    a[x][0][1] = y;
  } else if (d > a[x][1][0]) {
    a[x][1][0] = d;
    a[x][1][1] = y;
  }
}
int get(int x, int y) {
  if (a[x][0][1] == y) {
    return a[x][1][0];
  } else {
    return a[x][0][0];
  }
}
int dfs(int x, int y) {
  int i;
  for (i = 0; i < v[x].size(); i++) {
    if (v[x][i] == y) continue;
    update(x, v[x][i], dfs(v[x][i], x) + 1);
  }
  return a[x][0][0];
}
void dfs2(int x, int y, int d) {
  int i;
  update(x, y, d);
  for (i = 0; i < v[x].size(); i++) {
    if (v[x][i] == y) continue;
    dfs2(v[x][i], x, get(x, v[x][i]) + 1);
  }
}
void dfs3(int x, int y) {
  int i;
  for (i = 0; i < v[x].size(); i++) {
    int d1, d2;
    if (v[x][i] == y) continue;
    dfs3(v[x][i], x);
    d1 = get(x, v[x][i]);
    d2 = get(v[x][i], x);
    if (d1 < d2) {
      c[x] = min(c[x], d1 + 1);
    } else if (d1 == d2) {
      c[x] = min(c[x], d1);
    } else {
      c[v[x][i]] = min(c[v[x][i]], d2 + 1);
    }
  }
}
int main() {
  int n, i;
  long long ans = 0;
  scanf("%d", &n);
  for (i = 0; i < n - 1; i++) {
    int x, y;
    scanf("%d %d", &x, &y);
    x--;
    y--;
    v[x].push_back(y);
    v[y].push_back(x);
  }
  scanf("%s", s);
  for (i = 0; i < n; i++) a[i][0][1] = a[i][1][1] = -1;
  dfs(0, -1);
  dfs2(0, -1, 0);
  for (i = 0; i < n; i++) c[i] = a[i][0][0];
  dfs3(0, -1);
  for (i = 0; i < n; i++) ans += c[i] + 1;
  printf("%lld\n", ans);
  return 0;
}
