#include <bits/stdc++.h>

typedef long long ll;
typedef long long llong;
typedef long double ld;
typedef unsigned long long ull;

using namespace std;

/*
ll pw(ll a, ll b) {
	ll ans = 1; while (b) {
		while (!(b & 1)) b >>= 1, a = (a * a) % MOD;
		ans = (ans * a) % MOD, --b;
	} return ans;
}
*/
const int MAXN = 220000;

int n;
int was[MAXN];
vector<int> eds[MAXN];
int h[MAXN];
int sz[MAXN];
ll ans = 0;
char s[MAXN];
int sm;

void dfs1(int v) {
	was[v] = 1;
	if (s[v] == '1')
		sz[v] = 1;
	h[v] = 0;
	for (int u: eds[v]) {
		if (!was[u])
			dfs1(u), sz[v] += sz[u], h[v] = max(h[v], h[u] + 1);
	}
}

void dfs2(int v, int hh) { 
	vector<pair<int, int> > vv;
	vv.push_back(make_pair(0, s[v] - '0'));
	was[v] = 1;
	int mx1 = hh;
	int mx2 = 0;
	int cur = sm;
	if (s[v] == '1')
		--cur;
	for (int u: eds[v]) {
		if (was[u])
			continue;
		if (h[u] + 1 > mx2)
			mx2 = h[u] + 1;
		if (mx2 > mx1)
			swap(mx2, mx1);
		vv.push_back(make_pair(h[u] + 1, (sz[u] ? 1 : 0)));
		cur -= sz[u];
	}
	vv.push_back(make_pair(hh, (cur ? 1 : 0)));
	for (int u: eds[v]) {
		if (was[u])
			continue;
		if (h[u] + 1 == mx1)
			dfs2(u, mx2 + 1);
		else
			dfs2(u, mx1 + 1);
	}
	int fl = 0;
	sort(vv.begin(), vv.end());
	for (int i = 0; i < vv.size() - 1; ++i) {
		fl |= vv[i].second;
		if (fl) {
			if (i + 2 == vv.size()) {
				if (vv[i + 1].first > vv[i].first)
					++ans;
				if (vv[i + 1].first > vv[i].first + 1)
					++ans;
			}
			else {
				ans += vv[i + 1].first - vv[i].first;
			}
		}
	}
}

int main() {
	ans = 1;
	scanf("%d", &n);
	for (int i = 0; i < n - 1; ++i) {
		int a, b;
		scanf("%d%d", &a, &b);
		--a, --b;
		eds[a].push_back(b);
		eds[b].push_back(a);
	}
	scanf(" %s", s);
	for (int i = 0; i < n; ++i)
		if (s[i] == '1')
			++sm;
	dfs1(0);
	memset(was, 0, sizeof(was));
	dfs2(0, 0);
	cout << ans << "\n";
	return 0;
}


