#include<cstdio>
#include<algorithm>
using namespace std;
#define LL long long
#define MAXN 200010
#define INF 1000000000
int Adj[MAXN],V[MAXN*2],nxt[MAXN*2],c;
void AddEdge(int u,int v)
{
	c++;V[c]=v,nxt[c]=Adj[u];Adj[u]=c;
}
int n,siz[MAXN],mx[MAXN],sx[MAXN],l[MAXN],r[MAXN],sum;
char s[MAXN];
LL ans;
void dfs1(int u,int p)
{
	siz[u]=s[u]-'0';
	for(int i=Adj[u];i;i=nxt[i])
		if(V[i]!=p)
		{
			dfs1(V[i],u);
			siz[u]+=siz[V[i]];
			if(mx[V[i]]+1>mx[u]) sx[u]=mx[u],mx[u]=mx[V[i]]+1;
			else if(mx[V[i]]+1>sx[u]) sx[u]=mx[V[i]]+1;
		}
}
void dfs2(int u,int p,int len)
{
	r[u]=mx[u]<len?mx[u]:max(len,sx[u]);
	l[u]=s[u]-'0'?0:(sum-siz[u]?len:INF);
	if(p)
	{
		if(len-1==mx[u]) ans++;
		else if(len-1<mx[u]) ans+=siz[u]<sum;
		else ans+=siz[u]>0;
	}
	for(int i=Adj[u];i;i=nxt[i])
		if(V[i]!=p)
		{
			if(siz[V[i]]) l[u]=min(l[u],mx[V[i]]+1);
			if(mx[u]==mx[V[i]]+1) dfs2(V[i],u,max(len,sx[u])+1);
			else dfs2(V[i],u,max(len,mx[u])+1);
		}
}
int main()
{
	scanf("%d",&n);
	int u,v;
	for(int i=1;i<n;i++)
	{
		scanf("%d%d",&u,&v);
		AddEdge(u,v);
		AddEdge(v,u);
	}
	scanf("%s",s+1);
	for(int i=1;i<=n;i++) sum+=s[i]-'0';
	dfs1(1,0);
	dfs2(1,0,0);
	for(int i=1;i<=n;i++)
		if(l[i]<=r[i])
			ans+=1LL*r[i]-l[i]+1;
	printf("%lld\n",ans);
}