#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int head[N*2],lazy[N*4],f[N*4],n,NT,val[N],x,y,tot,cnt,xx;
char ch;
struct Edge{int to,nex;}edge[N*2];
struct Tree{int deid,id,dep,fa,son,st,top,val;}T[N];
void ins(int x,int y){edge[tot].to=y;edge[tot].nex=head[x];head[x]=tot++;}
int remax(int x,int y){return (T[x].dep>T[y].dep?x:y);}
void pushdown(int numk,int len){
if (!lazy[numk]) return;
lazy[numk<<1]=remax(lazy[numk<<1],lazy[numk]);
lazy[numk<<1|1]=remax(lazy[numk<<1|1],lazy[numk]);
f[numk<<1]=remax(f[numk<<1],lazy[numk]);
f[numk<<1|1]=remax(f[numk<<1|1],lazy[numk]);
lazy[numk]=0;
}
void pushup(int numk){f[numk]=remax(f[numk<<1],f[numk<<1|1]);}
void build(int numk,int l,int r){
if (l==r) f[numk]=0;
else{
int mid=(l+r)>>1;
build(numk<<1,l,mid);
build(numk<<1|1,mid+1,r);
pushup(numk);
}
}
void change_t(int numk,int fl,int fr,int l,int r,int x){
if (fl<=l&&fr>=r) f[numk]=remax(f[numk],x),lazy[numk]=remax(lazy[numk],x);
else{
pushdown(numk,r-l+1);
int mid=(l+r)>>1;
if (fl<=mid) change_t(numk<<1,fl,fr,l,mid,x);
if (fr>mid) change_t(numk<<1|1,fl,fr,mid+1,r,x);
pushup(numk);
}
}
int query_t(int numk,int fl,int fr,int l,int r){
if (fl<=l&&fr>=r) return f[numk];
else{
pushdown(numk,r-l+1);
int mid=(l+r)>>1,ma=0;
if (fl<=mid) ma=remax(ma,query_t(numk<<1,fl,fr,l,mid));
if (fr>mid) ma=remax(ma,query_t(numk<<1|1,fl,fr,mid+1,r));
return ma;
}
}
void dfs1(int u,int fa,int dep){
int ms=-1;
T[u].dep=dep;T[u].fa=fa;T[u].st=1;
for (int i=head[u];~i;i=edge[i].nex){
int v=edge[i].to;
if (v==fa) continue;
dfs1(v,u,dep+1);
T[u].st+=T[v].st;
if (T[v].st>ms) ms=T[v].st,T[u].son=v;
}
}
void dfs2(int u,int top){
T[u].top=top;T[u].id=++cnt;T[cnt].val=val[u];T[cnt].deid=u;
if (!T[u].son) return;
dfs2(T[u].son,top);
for (int i=head[u];~i;i=edge[i].nex){
int v=edge[i].to;
if (v==T[u].son||v==T[u].fa) continue;
dfs2(v,v);
}
}
int query(int x,int y){
int ans=0;
while (T[x].top!=T[y].top){
if (T[T[x].top].dep>T[T[y].top].dep) swap(x,y);
ans=remax(ans,query_t(1,T[T[x].top].id,T[x].id,1,n));
if (ans!=-1) return T[ans].deid;
x=T[T[x].top].fa;
}
if (T[x].dep>T[y].dep) swap(x,y);
ans=remax(ans,query_t(1,T[x].id,T[y].id,1,n));
return T[ans].deid;
}
void change(int x){
change_t(1,T[x].id,T[x].id+T[x].st-1,1,n,x);
}
int main(){
scanf("%d%d",&n,&NT);val[1]=1;
memset(head,-1,sizeof(head));
for (int i=1;i<n;i++) scanf("%d%d",&x,&y),ins(x,y),ins(y,x);
dfs1(1,0,1);dfs2(1,1);build(1,1,n);change_t(1,1,n,1,n,1);
while (NT--){
cin>>ch;scanf("%d",&xx);
if (ch=='Q') printf("%d\n",query(1,xx));
else change(xx);
}
return 0;
}