/*
现在你有一棵树, 节点已经被染上颜色, 非黑(B)即白(W)
你可以从任意一个节点出发, 并执行操作: 

将所在节点的颜色反转 or 
走到下一个节点, 并反转它的颜色

问最少操作多少次, 能使得树是黑涩的(即无白色节点)
*/
#include<bits/stdc++.h>
using namespace std;

const int N=1e5+5;

long long ans,cost[N];

int root,n,cnt,to[N<<1],nxt[N<<1],head[N],du[N];

bool Del[N],vis[N],val[N];

char c[N];

queue<int>que;

void add(int x,int y){
	to[++cnt]=y;nxt[cnt]=head[x];head[x]=cnt;
}

void sol(int x,int f){
	for(int i=head[x];i;i=nxt[i])
		if(to[i]!=f&&!Del[to[i]]){
			sol(to[i],x);
			if(val[x]==1) ans=min(ans,cost[x]+cost[to[i]]-3);
			else ans=min(ans,cost[x]+cost[to[i]]-1);
			cost[x]=min(cost[to[i]]-1,cost[x]);
		}
	if(val[x]) cost[x]--;
	else cost[x]++;
}


int main(){
	scanf("%d",&n);
	for(int i=1;i<n;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		add(x,y);add(y,x);
		du[x]++;du[y]++;
	}
	scanf("%s",c+1);
	for(int i=1;i<=n;i++){
		if(du[i]==1&&c[i]=='B') que.push(i);
	}
	while(!que.empty()){
		int x=que.front();que.pop();
		Del[x]=1;
		for(int i=head[x];i;i=nxt[i]){
			du[to[i]]--;
			if(c[to[i]]=='B'&&du[to[i]]==1&&!Del[to[i]]) que.push(to[i]);
		}
	}
	for(int i=1;i<=n;i++)
		if(!Del[i]) {root=i;break;}
	if(!root) printf("0\n");
	else {
		for(int i=1;i<=n;i++)
			if(!Del[i]){
				val[i]=((du[i]%2)&&c[i]=='B')|(!(du[i]%2)&&c[i]=='W');
			}
		sol(root,0);
		for(int i=1;i<=n;i++)
			if(!Del[i]){
				ans+=val[i]+2;
			}
		ans-=2;
		printf("%lld\n",ans);
	}
	return 0;
}