#include<bits/stdc++.h>
void mins(int&a,int b){if(a>b)a=b;}
int min(int a,int b){return a<b?a:b;}
int max(int a,int b){return a>b?a:b;}
void upd(int&a,int&b,int c){
	if(c>=a)b=a,a=c;
	else if(c>b)b=c;
}
const int N=2e5+7;
long long ans=1;
int n;
char s[N];
struct edge{
	int to;
	edge*nx;
}e[N*2],*ep=e;
edge*e0[N];
int d1[N],d2[N],d3[N],d4[N],sz[N];
void f1(int w,int pa){
	sz[w]=s[w]-'0';
	for(edge*i=e0[w];i;i=i->nx){
		int u=i->to;
		if(u==pa)continue;
		f1(u,w);
		if(sz[u]){
			sz[w]+=sz[u];
			mins(d4[w],d1[u]+1);
		}
		upd(d1[w],d2[w],d1[u]+1);
	}
}
void f2(int w,int pa){
	for(edge*i=e0[w];i;i=i->nx){
		int u=i->to;
		if(u==pa)continue;
		int d=max(d3[w],d1[w]==d1[u]+1?d2[w]:d1[w])+1;
		if(sz[u]!=sz[1])mins(d4[u],d);
		d3[u]=d;
		f2(u,w);
	}
}
int main(){
	scanf("%d",&n);
	for(int i=1,a,b;i<n;++i){
		scanf("%d%d",&a,&b);
		*ep=(edge){b,e0[a]};e0[a]=ep++;
		*ep=(edge){a,e0[b]};e0[b]=ep++;
	}
	scanf("%s",s+1);
	for(int i=1;i<=n;++i)if(s[i]=='0')d4[i]=N;
	f1(1,0);f2(1,0);
	for(int i=1;i<=n;++i){
		upd(d1[i],d2[i],d3[i]);
		ans+=max(0,min(d1[i]-1,d2[i]+1)-d4[i]+1);
	}
	printf("%lld\n",ans);
	return 0;
}