#include<bits/stdc++.h>
using namespace std;
const int N=2e5+100;
int head[N],next[N],to[N],fa[N];
int sum[N],all;bool is[N];
int ans;
int one[N],two[N];
inline void dfs1(int k) {
	sum[k]=is[k];
	for (int i=head[k];i;i=next[i])
		if (to[i]!=fa[k]) {
			fa[to[i]]=k;
			dfs1(to[i]);
			if (one[to[i]]+1>one[k])
				two[k]=one[k],one[k]=one[to[i]]+1;
			else two[k]=max(two[k],one[to[i]]+1);
			sum[k]+=sum[to[i]];
		}
}
inline void dfs2(int k,int mx) {
	int l=all-sum[k]?mx:1<<30,r,i,One=mx,Two=0;
	for (i=head[k];i;i=next[i])
		if (to[i]!=fa[k]) {
			if (one[to[i]]+1>One)
				Two=One,One=one[to[i]]+1;
			else Two=max(Two,one[to[i]]+1);
			if (sum[to[i]]) l=min(l,one[to[i]]+1);
		}
	r=One==Two?One-1:(One==Two+1?Two:Two+1);
	if (is[k]) ans+=r+1;
	else if (l<=r) ans+=r-l+1;
	for (i=head[k];i;i=next[i])
		if (to[i]!=fa[k])
			dfs2(to[i],(one[to[i]]+1==One?Two:One)+1);
}
int main()
{
	int n,i,a,b,tot=0;char c;
	for (i=1,cin>>n;i<n;i++) {
		cin>>a>>b;
		to[++tot]=b,next[tot]=head[a],head[a]=tot;
		to[++tot]=a,next[tot]=head[b],head[b]=tot;
	}
	for (i=1;i<=n;all+=is[i++]=c-'0') while ((c=getchar())<'0'||'9'<c);
	dfs1(1);
	dfs2(1,0);
	cout<<ans+1<<endl;
	return 0;
}
