#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,q;
struct edg{
int v,next;
}edge[1000005];
int num,head[1000005];
int f[1000005];
void add(int u,int v){
edge[++num].next=head[u];
head[u]=num;
edge[num].v=v;
}
int fa[1000005],siz[1000005],son[1000005],dep[1000005];
int id[1000005],cnt,top[1000005];
struct node{
int val;
}tree[1000005<<2];
inline void pushup(int p){
tree[p].val=tree[p<<1].val+tree[p<<1|1].val;
}
inline void update(int p,int l,int r,int ql,int qr){
if(l>qr||r<ql)return;
if(l>=ql&&r<=qr){
if(l!=r)exit(1);
tree[p].val=1;
return;
}
int mid=l+r>>1;
update(p<<1,l,mid,ql,qr);
update(p<<1|1,mid+1,r,ql,qr);
pushup(p);
}
inline int query(int p,int l,int r,int ql,int qr){
if(l==r)return l;
int mid=l+r>>1;
int t=-1;
if(tree[p<<1|1].val>0&&!(mid+1>qr||r<ql)){
t=query(p<<1|1,mid+1,r,ql,qr);
}
else if(tree[p<<1].val>0&&!(l>qr||mid+1<ql)){
t=query(p<<1,l,mid,ql,qr);
}
return t;
}
void dfs1(int now,int fath,int deep){
siz[now]=1;
dep[now]=deep;
fa[now]=fath;
int maxson=-1;
for(int i=head[now];i;i=edge[i].next){
int v=edge[i].v;
if(v==fath)continue;
dfs1(v,now,deep+1);
if(siz[v]>maxson){
maxson=siz[v];
son[now]=v;
}
siz[now]+=siz[v];
}
}
void dfs2(int now,int topf){
id[now]=++cnt;
f[id[now]]=now;
top[now]=topf;
if(!son[now])return;
dfs2(son[now],topf);
for(int i=head[now];i;i=edge[i].next){
int v=edge[i].v;
if(v==son[now]||v==fa[now])continue;
dfs2(v,v);
}
}
inline int qrange(int x,int y){
int ans=1;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
ans=max(ans,query(1,1,n,id[top[x]],id[x]));
x=fa[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
ans=max(ans,query(1,1,n,id[x],id[y]));
return ans;
}
signed main(){
cin>>n>>q;
// exit(n);
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
add(u,v);
add(v,u);
}
dfs1(1,0,1);
dfs2(1,1);
update(1,1,n,1,1);
while(q--){
char op;
int x;
cin>>op>>x;
if(op=='C'){
update(1,1,n,id[x],id[x]);
}
else{
cout<<f[qrange(1,x)]<<"\n";
}
}
return 0;
}