#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define INF 200000000
#define M 400020
using namespace std;
int read(){
	int nm=0,fh=1;char cw=getchar();
	for(;!isdigit(cw);cw=getchar()) if(cw=='-') fh=-fh;
	for(;isdigit(cw);cw=getchar()) nm=nm*10+(cw-'0');
	return nm*fh;
}
LL ans;
int n,m,fs[M],to[M],nt[M],D[M][2],F[M],G[M],sum[M],tmp,u,v;
void link(int x,int y){nt[tmp]=fs[x],fs[x]=tmp,to[tmp++]=y;}
char ch[M];
void DFS1(int x,int last){
	sum[x]=(ch[x]=='1'),F[x]=INF*(sum[x]^1);
	for(int i=fs[x];i!=-1;i=nt[i]){
		if(to[i]==last) continue;
		DFS1(to[i],x),sum[x]+=sum[to[i]];
		int maxn=D[to[i]][0]+1;
		if(maxn>=D[x][0]) D[x][1]=D[x][0],D[x][0]=maxn;
		else D[x][1]=max(D[x][1],maxn);
		if(sum[to[i]]) F[x]=min(F[x],maxn);
	}
}
void DFS2(int x,int last){
	if(last){
		G[x]=G[last]+1;
		if(D[last][0]==D[x][0]+1) G[x]=max(G[x],D[last][1]+1);
		else G[x]=max(G[x],D[last][0]+1);
		if(sum[x]!=sum[1]) F[x]=min(F[x],G[x]);
	}
	for(int i=fs[x];i!=-1;i=nt[i]) if(to[i]!=last) DFS2(to[i],x);
	if(G[x]>=D[x][0]) D[x][1]=D[x][0],D[x][0]=G[x];
	else D[x][1]=max(D[x][1],G[x]);
	ans+=max(0,min(D[x][0],D[x][1]+2)-F[x]);
}
int main(){
	n=read(),memset(fs,-1,sizeof(fs));
	for(int i=1;i<n;i++) u=read(),v=read(),link(u,v),link(v,u);
	scanf("%s",ch+1),DFS1(1,0),DFS2(1,0),printf("%lld\n",ans+(sum[1]>0));
	return 0;
}