#include<bits/stdc++.h>
#define Max(a,b) (dep[a]>dep[b]?a:b)
using namespace std;
const int N=1e5+5;
int n,q,dep[N],dfn[N],lb[N],rb[N],tot,tr[N*4];
vector<int>con[N];
void dfs(int u,int fa){
dep[dfn[lb[u]=++tot]=u]=dep[fa]+1;
for(int v:con[u])if(v!=fa)dfs(v,u);
rb[u]=tot;
}
void update(int cur,int l,int r,int ql,int qr){
if(ql<=l && r<=qr){tr[cur]=Max(tr[cur],dfn[ql]);return ;}
int mid=(l+r)>>1;
if(ql<=mid)update(cur<<1,l,mid,ql,qr);
if(qr>mid)update(cur<<1|1,mid+1,r,ql,qr);
}
int query(int cur,int l,int r,int loc){
int res=tr[cur];
if(l==r)return res;
int mid=(l+r)>>1;
return Max(res,(loc<=mid?query(cur<<1,l,mid,loc):query(cur<<1|1,mid+1,r,loc)));
}
int main(){
scanf("%d%d",&n,&q);
for(int i=1,u,v;i<n;i++)scanf("%d%d",&u,&v),con[u].push_back(v),con[v].push_back(u);
dfs(1,0);
update(1,1,n,1,n);
while(q--){
char s[2];int x;
scanf("%s%d",s,&x);
if(*s=='C')update(1,1,n,lb[x],rb[x]);
else printf("%d\n",query(1,1,n,lb[x]));
}
}