//Heaplax
//别让自己后悔
#include<bits/stdc++.h>
#define N 200001
#define int long long
#define LOG(x) cerr<<#x<<" = "<<x<<endl
#define add_edge(u,v) nxt[++cnt]=head[u],head[u]=cnt,to[cnt]=v
#define open(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
char ch;bool fs;void re(int& x)
{
	while(ch=getchar(),ch<33);
	if(ch=='-')fs=1,x=0;else fs=0,x=ch-48;
	while(ch=getchar(),ch>33)x=x*10+ch-48;
	if(fs)x=-x;
}
using namespace std;
char s[N+5];
int n,ans,all,fa[N];
int f1[N];//父亲不到i的子树最远距离
int f2[N];//i到所有点最长距离
int f3[N];//i到i的子树的最长距离
int f4[N];//i到i的子树的第二长距离
int f5[N];//i到子树一个关键点的子树最长距离最小值
int f6[N];//i的子树里有几个关键点
int cnt,head[N],nxt[N+N],to[N+N];
void dfs1(int u)
{
	f5[u]=n;
	if(s[u]=='1')f6[u]=1;
	for(int i=head[u],v;i;i=nxt[i])
		if((v=to[i]) != fa[u])
		{
			fa[v]=u;
			dfs1(v);
			if(f6[v])f5[u]=min(f5[u],f3[v]+1);
			f6[u]+=f6[v];
			if(f3[v]+1>f3[u])
				f4[u]=f3[u],f3[u]=f3[v]+1;
			else if(f3[v]+1>f4[u])
				f4[u]=f3[v]+1;
		}
}
void dfs2(int u)
{
	f2[u]=max(f3[u],f1[u]+1);
	int d=min(f2[u]-1,f3[u]+1),t=f5[u];
	if(f6[u]!=all)t=min(t,f1[u]+1);
	if(s[u]=='1')t=0;
	for(int i=head[u],v;i;i=nxt[i])
		if((v=to[i]) != fa[u])
		{
			f1[v]=max(f1[u]+1,f3[v]+1==f3[u]?f4[u]:f3[u]);
			d=min(d,f1[v]+1);
			dfs2(v);
		}
	// LOG(u);LOG(d);
	ans+=max(0ll,d-t+1);
}
main()
{
	re(n);
	for(int i=1,u,v;i<n;++i)
	{
		re(u),re(v);
		add_edge(u,v);
		add_edge(v,u);
	}
	scanf("%s",s+1);
	for(int i=1;i<=n;++i)
		all+=s[i]-'0';
	if(!all)return puts("0"),0;
	dfs1(1);
	dfs2(1);
	printf("%lld\n",++ans);
}
