#include<bits/stdc++.h>
#define lu u*2
#define ru u*2+1
using namespace std;
int n,m,r,p,i,a[200000],nxt[200000],head[200000],to[200000],cnt,tot,b[200000],x,y,f[200000],T,z,tre[500000],laz[500000];
char ch;
struct node{
int dep,hs,len,fa,top,dfn;
}tr[200000];
void add(int u,int v){nxt[++cnt]=head[u];head[u]=cnt;to[cnt]=v;}
int dfs1(int u,int dep,int fa){
tr[u].dep=dep;
tr[u].hs=0;
tr[u].len=1;
for(int i=head[u];i;i=nxt[i]){
int v=to[i];
if(v==fa)continue;
tr[u].len+=dfs1(v,dep+1,u);
tr[v].fa=u;
if(tr[v].len>tr[tr[u].hs].len)tr[u].hs=v;
}
return tr[u].len;
}
void dfs2(int u,int top){
tr[u].top=top;
tot++;
tr[u].dfn=tot;
b[tot]=u;
if(tr[u].hs){
dfs2(tr[u].hs,top);
for(int i=head[u];i;i=nxt[i])
if(to[i]!=tr[u].fa&&to[i]!=tr[u].hs){
dfs2(to[i],to[i]);
}
}
}
void build(int u,int x,int y){
if(x==y){
tre[u]=0;
return;
}
int mid=(x+y)>>1;
build(lu,x,mid);build(ru,mid+1,y);
}
void down(int u,int x,int y,int mid){
laz[lu]=max(laz[lu],laz[u]);laz[ru]=max(laz[ru],laz[u]);
tre[lu]=max(tre[lu],laz[lu]);tre[ru]=max(tre[ru],laz[ru]);
laz[u]=0;
}
void add(int u,int x,int y,int l,int r){
if(l<=x&&y<=r){
tre[u]=laz[u]=max(tre[u],l);
return;
}
int mid=(x+y)>>1;
down(u,x,y,mid);
if(l<=mid)add(lu,x,mid,l,r);
if(r>mid)add(ru,mid+1,y,l,r);
tre[u]=max(tre[lu],tre[ru]);
}
int query(int u,int x,int y,int l,int r){
if(l<=x&&y<=r)return tre[u];
int mid=(x+y)>>1,s=0;
down(u,x,y,mid);
if(l<=mid)s=max(s,query(lu,x,mid,l,r));
if(r>mid)s=max(s,query(ru,mid+1,y,l,r));
return s;
}
int main(){
scanf("%d%d",&n,&m);
for(i=1;i<n;i++){
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
dfs1(1,1,0);
dfs2(1,1);
build(1,1,n);
add(1,1,n,tr[1].dfn,n);
for(i=1;i<=m;i++){
getchar();getchar();
scanf("%c%d",&ch,&x);
if(ch=='C'){
add(1,1,n,tr[x].dfn,tr[x].dfn+tr[x].len-1);
}else{
printf("%d\n",b[query(1,1,n,tr[x].dfn,tr[x].dfn)]);
}
}
return 0;
}