#include <bits/stdc++.h>
using namespace std;
int n,head[100010],deg[100010],ans=0,rt,d1,d2,tmp,o=0;
char c[100010];
bool un[100010],flag;
struct edge{
	int to,link;
}e[200010];
void add_edge(int u,int v){
	deg[u]++,deg[v]++;
	e[++o].to=v,e[o].link=head[u],head[u]=o;
	e[++o].to=u,e[o].link=head[v],head[v]=o;
}
void dfs(int u,int pre,int dep,int &now){
	dep+=!c[u];
	if(dep>=tmp) tmp=dep,now=u;
	for(int i=head[u];i;i=e[i].link){
		if(e[i].to==pre||un[e[i].to]) continue;
		dfs(e[i].to,u,dep,now);
	}
}
queue<int>q;
int main(){
	scanf("%d",&n);
	for(int i=1,u,v;i<n;i++) scanf("%d %d",&u,&v),add_edge(u,v);
	scanf("%s",c+1);
	for(int i=1;i<=n;i++) c[i]=(c[i]=='B'),flag|=!c[i];
	if(!flag) return puts("0"),0;
	for(int i=1;i<=n;i++) if(deg[i]<=1&&c[i]) q.push(i);
	while(!q.empty()){
		int now=q.front();q.pop();
		un[now]=true;
		for(int i=head[now];i;i=e[i].link){
			if(un[e[i].to]) continue;
			deg[e[i].to]--;
			if(deg[e[i].to]<=1&&c[e[i].to]) q.push(e[i].to);
		}
	}
	for(int i=1;i<=n;i++){
		if(un[i]) continue;
		rt=i;
		for(int j=head[i];j;j=e[j].link){
			if(!un[e[j].to]) c[e[j].to]^=1;
		}
		ans+=2;
	}
	for(int i=1;i<=n;i++) ans+=(!un[i]&&!c[i]);
	tmp=0,ans-=2;
	dfs(rt,0,0,d1);
	tmp=0;
	dfs(d1,0,0,d2); 
//	cout<<tmp<<"\n";
	printf("%d\n",max(1,ans-2*tmp));
} 