#include<bits/stdc++.h>
using namespace std;
const int N=310000;
int n,size[N],son[N],top[N],dfn[N],deep[N],f[N],cnt,q,tot,zuo[N],you[N],c,head[N];
struct xzh{
int next,to;
}edge[2*N];
struct hh{
int l,r,sum;
}tree[4*N];
void build(int p,int l,int r){
tree[p].l=l;tree[p].r=r;
if(l==r)return;
int mid=(l+r)/2;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
}
void add(int u,int v){
c++;
edge[c].next=head[u];
edge[c].to=v;
head[u]=c;
}
void dfs1(int now,int fa){
size[now]=1;
for(int i=head[now];i;i=edge[i].next){
int v=edge[i].to;
if(v!=fa){
deep[v]=deep[now]+1;
f[v]=now;
dfs1(v,now);
size[now]+=size[v];
if(size[v]>size[son[now]])son[now]=v;
}
}
}
void dfs2(int now,int topp){
cnt++;
dfn[now]=cnt;
top[now]=topp;
if(!son[now])return;
dfs2(son[now],topp);
for(int i=head[now];i;i=edge[i].next){
int v=edge[i].to;
if(!dfn[v])
dfs2(v,v);
}
}
void change(int p,int x,int d){
if(tree[p].l==tree[p].r){
tree[p].sum+=d;
return;
}
int mid=(tree[p].l+tree[p].r)/2;
if(x<=mid)change(p*2,x,d);
else change(p*2+1,x,d);
tree[p].sum=tree[p*2].sum+tree[p*2+1].sum;
}
int ask(int p,int l,int r){
if(l<=tree[p].l&&tree[p].r<=r)return tree[p].sum;
int ans=0;
int mid=(tree[p].l+tree[p].r)/2;
if(l<=mid)ans+=ask(p*2,l,r);
if(r>mid)ans+=ask(p*2+1,l,r);
return ans;
}
int sum(int x,int y){
int ans=0;
if(top[x]!=top[y]){
if(deep[top[x]]<deep[top[y]])swap(x,y);
ans+=ask(1,dfn[top[x]],dfn[x]);
x=f[top[x]];
}
if(deep[x]>deep[y])swap(x,y);
ans+=ask(1,dfn[x]+1,dfn[y]);
return ans;
}
int main(){
scanf("%d%d",&n,&q);
for(int i=1;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
dfs1(1,0);
dfs2(1,1);
build(1,1,n);
while(q--){
char op;int x,y;
cin>>op;
scanf("%d",&x);
if(op=='C'){
scanf("%d",&y);
tot++;zuo[tot]=x;you[tot]=y;
if(f[y]==x)swap(x,y);
change(1,dfn[x],1);
}
else if(op=='Q'){
scanf("%d",&y);
if(!sum(x,y))printf("Yes\n");
else printf("No\n");
}
else {
if(f[zuo[x]]==you[x])change(1,dfn[zuo[x]],-1);
else change(1,dfn[you[x]],-1);
}
}
return 0;
}