#include <bits/stdc++.h>
using namespace std;
int n;
vector<vector<int>> g;
vector<bool> gen;
vector<int> dp;
void dfs(int c, int p){
int s=0;
for(auto a:g[c]){
if(a==p)continue;
dfs(a,c);
s+=dp[a];
}
if(gen[c])dp[c]=max(s,1);
else dp[c]=max(s, 0);
}
/*
void pomeri(int c, int p, int pren){
int s=0;
for(auto a:g[c])s+=dp[a];
int tmp=dp[c];
if(a=
}
*/
int main(){
// unesemo, smanjimo sve za po 1, iracunamo br genratora
cin>>n;
g.resize(n);
for(int i=0;i<n;i++)g[i].clear();
for(int i=0;i<n-1;i++){
int x,y;
cin>>x>>y;
x--;y--;
g[x].push_back(y);
g[y].push_back(x);
}
gen.resize(n);
string s;
cin>>s;
for(int i=0;i<n;i++){
if(s[i]=='0')gen[i]=false;
else gen[i]=true;
}
int sumaa=0;
for(int i=0;i<n;i++)sumaa+=gen[i];
// ako je br jedan ili dva odgovor je jedan ili 2
if(sumaa<=2){
cout<<sumaa<<endl;
return 0;
}
// izracunamo dp za neki cvor kao koren
dp.assign(n,0);
dfs(0,-1);
//pomeramo koren
int ans=0;
for(int i=0;i<n;i++){
dp.assign(n,0);
dfs(i,-1);
ans=max(ans,dp[i]);
}
cout<<max(ans,2)<<endl;
return 0;
}