#include <bits/stdc++.h>
using namespace std;
#define MAXN 200001
#define int long long
int n;vector<int> adj[MAXN];
int dist[MAXN],parent[MAXN];
vector<int> switches;
set<int> on,breakovani;
void dfs(int node,int pret,int depth)
{
parent[node]=pret;dist[node]=depth;
for (int sled:adj[node])
{
if (sled!=pret) dfs(sled,node,depth+1);
}
}
int32_t main()
{
cin>>n;for (int i=1;i<n;i++) {int u,v;cin>>u>>v;adj[u].push_back(v);adj[v].push_back(u);}
dfs(1,0,0);string s;cin>>s;
for (int node=1;node<=n;node++)
{
if (s[node-1]=='1') switches.push_back(node);
}
if (n<=16)
{
int answer=-INT_MAX;
for (int maska=0;maska<(1<<((int)switches.size()));maska++)
{
vector<int> vec;
for (int bit=0;bit<(int)switches.size();bit++)
{
if (maska&(1<<bit)) {vec.push_back(switches[bit]);on.insert(switches[bit]);}
}
for (int pos1=0;pos1<(int)vec.size();pos1++)
{
for (int pos2=pos1+1;pos2<(int)vec.size();pos2++)
{
if (on.find(vec[pos1])==on.end() or on.find(vec[pos2])==on.end()) continue;
int curr1=vec[pos1],curr2=vec[pos2];
while (dist[curr1]>dist[curr2])
{
if (binary_search(switches.begin(),switches.end(),curr1) and (curr1!=vec[pos1] and curr1!=vec[pos2]))
{
breakovani.insert(curr1);
if (on.find(curr1)!=on.end()) on.erase(curr1);
}
curr1=parent[curr1];
}
while (dist[curr2]>dist[curr1])
{
if (binary_search(switches.begin(),switches.end(),curr2) and (curr2!=vec[pos1] and curr2!=vec[pos2]))
{
breakovani.insert(curr2);
if (on.find(curr2)!=on.end()) on.erase(curr2);
}
curr2=parent[curr2];
}
while (curr1!=curr2)
{
if (binary_search(switches.begin(),switches.end(),curr1) and (curr1!=vec[pos1] and curr1!=vec[pos2]))
{
breakovani.insert(curr1);
if (on.find(curr1)!=on.end()) on.erase(curr1);
}
if (binary_search(switches.begin(),switches.end(),curr2) and (curr2!=vec[pos1] and curr2!=vec[pos2]))
{
breakovani.insert(curr2);
if (on.find(curr2)!=on.end()) on.erase(curr2);
}
curr1=parent[curr1];curr2=parent[curr2];
}
if (binary_search(switches.begin(),switches.end(),curr1) and (curr1!=vec[pos1] and curr1!=vec[pos2]))
{
breakovani.insert(curr1);
if (on.find(curr1)!=on.end()) on.erase(curr1);
}
}
}
answer=max(answer,(int)on.size()-(int)breakovani.size());
on.clear();breakovani.clear();
}
cout<<answer<<endl;return 0;
}
return 0;
}