#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cstdio>
#include<cmath>
#define ll long long
#define N 10000001
#define inf 2147483647
#define in inline
#define re register
#define debug putchar('1');
using namespace std;
inline int rd(){char a=getchar();int f=1,x=0;while(a<'0'||a>'9'){if(a=='-')f=-1;a=getchar();}while(a>='0'&&a<='9'){x=(x<<3)+(x<<1)+(long(a^48));a=getchar();}return f*x;}void qwqqwq(ll x){if(x!=0){qwqqwq(x/10);putchar(x%10^48);}return;}in void wt(ll x){if(x==0){putchar('0');return;}if(x<0){x=-x;putchar('-');}qwqqwq(x);return;}in ll max(ll a,ll b){return a>b?a:b;}in ll min(ll a,ll b){return a>b?b:a;}in ll abs(ll a){return a<0?-a:a;}in void swap(ll &a,ll &b){a^=b;b^=a;a^=b;}
struct node{
int nxt,to;
}edge[N];
struct tree{
int l,r,w;
}t[N];
int h[N],cnt,dep[N],si[N],f[N],son[N],top[N],id[N],val[N],tot;
in void add(int u,int v){
edge[cnt].to=v;
edge[cnt].nxt=h[u];
h[u]=cnt++;
return;
}
void build(int i,int l,int r){
t[i].l=l;
t[i].r=r;
t[i].w=-1;
if(l==r)
return;
int mid=(l+r)>>1;
build(i<<1,l,mid);
build(i<<1|1,mid+1,r);
return;
}
void up(int i,int l,int r){
if(t[i].l>=l&&t[i].r<=r){
t[i].w=l;
return;
}
if(t[i<<1].r>l)
up(i<<1,l,r);
if(t[i<<1|1].l<=r)
up(i<<1|1,l,r);
t[i].w=max(t[i<<1].w,t[i<<1|1].w);
return;
}
int qu(int i,int l,int r){
if(t[i].l>=l&&t[i].r<=r)
return t[i].w;
int ans=0;
if(t[i<<1].r>l)
ans=qu(i<<1,l,r);
if(t[i<<1|1].l<=r)
ans=max(ans,qu(i<<1|1,l,r));
return ans;
}
void dfs1(int u,int fa){
dep[u]=dep[fa]+1;
f[u]=fa;
si[u]=1;
int maxn=-inf;
for(re int i=h[u];i;i=edge[i].nxt){
int t=edge[i].to;
if(t==f[u])
continue;
dfs1(t,u);
si[u]+=si[t];
if(si[u]>maxn){
son[u]=t;
maxn=si[t];
}
}
return;
}
void dfs2(int u,int tp){
id[u]=++tot;
val[tot]=u;
top[u]=tp;
if(!son[u])
return;
dfs2(son[u],tp);
for(re int i=h[u];i;i=edge[i].nxt){
int t=edge[i].to;
if(t==f[u]||t==son[u])
continue;
dfs2(u,u);
}
return;
}
void up1(int x){
up(1,id[x],id[x+1]);
return;
}
int qu1(int x,int y){
int ans=-1;
while(top[x]!=top[y]){
if(dep[id[x]]<dep[id[y]])
swap(x,y);
ans=qu(1,id[top[x]],id[x]+1);
if(ans!=-1)
return val[ans];
x=f[top[x]];
}
if(dep[x]>dep[y])
swap(x,y);
ans=qu(1,id[x],id[y]+1);
return val[ans];
}
signed main(){
int n=rd(),q=rd()+1;
for(re int i=1;i<n;++i){
int u=rd(),v=rd();
add(u,v),add(v,u);
}
dfs1(1,0);
dfs2(1,1);
build(1,1,n+1);
up(1,1,2);
while(--q){
char ch=getchar();
while(ch!='C'&&ch!='Q')
ch=getchar();
int x=rd();
if(ch=='C')
up1(x);
else wt(qu1(x,1)),putchar('\n');
}
return 0;
}
AC#11