#include<bits/stdc++.h>
using namespace std;
#define int long long
int read()
{
int f=1,x=0;
char c=getchar();
while(!isdigit(c))
{
if(c=='-') f=-1;
c=getchar();
}
while(isdigit(c))
{
x=(x<<3)+(x<<1)+(c^48);
c=getchar();
}
return f*x;
}
void write(int x) {
if(x < 0) {
putchar('-');
x = -x;
}
if(x > 9) write(x/10);
putchar(x%10 + '0');
}
const int N = 3e5 + 5;
const int inf = INT_MAX;
int cnt,seg[N],dfn[N],cntu,siz[N],son[N],top[N],dep[N],f[N];
int n,m;
pair<int,int> war[N];
vector<int> G[N];
void dfs1(int u,int fa)
{
f[u] = fa;
dep[u] = dep[fa] + 1;
siz[u] = 1;
for(int v : G[u])
{
if(v == fa) continue;
dfs1(v,u);
siz[u] += siz[v];
if(!son[u] || siz[son[u]] < siz[v])
son[u] = v;
}
}
void dfs2(int u,int t)
{
top[u] = t;
dfn[u] = ++cntu;
seg[cntu] = u;
if(!son[u]) return;
dfs2(son[u],t);
for(int v : G[u])
if(v != f[u] && v != son[u])
dfs2(v,v);
}
int maxn[N<<2];
void up(int i)
{
maxn[i] = max(maxn[i<<1], maxn[i<<1|1]);
return ;
}
void build(int l,int r,int i)
{
if(l==r)
{
maxn[i] = -1;
return;
}
int mid = l + r >> 1;
build(l,mid,i<<1);
build(mid+1,r,i<<1|1);
up(i);
}
void update(int jobi,int v,int l,int r,int i)
{
if(l == r)
{
maxn[i] = v;
return;
}
int mid = l + r >> 1;
if(mid >= jobi)
update(jobi,v,l,mid,i<<1);
else
update(jobi,v,mid+1,r,i<<1|1);
up(i);
}
int query(int jobl,int jobr,int l,int r,int i)
{
if(jobl <= l && r <= jobr)
return maxn[i];
int mid = l + r >> 1,ans = -1;
if(mid >= jobl)
ans = max(ans,query(jobl,jobr,l,mid,i<<1));
if(mid < jobr)
ans = max(ans,query(jobl,jobr,mid+1,r,i<<1|1));
return ans;
}
void r_upd(int x,int y,int v)
{
if(dep[x] < dep[y]) swap(x,y);
update(dfn[x],v,1,n,1);
}
int road_query(int x,int y)
{
int ans = -1;
if(top[x]!=top[y])
{
if(dep[top[x]] < dep[top[y]]) swap(x,y);
ans = max(ans,query(dfn[top[x]],dfn[x],1,n,1));
x = f[top[x]];
}
if(x == y)
return ans;
if(dep[x] > dep[y]) swap(x,y);
return max(ans,query(dfn[x] + 1,dfn[y],1,n,1));
}
signed main()
{
n = read(),m = read();
for(int i=1;i<n;i++)
{
int u = read(),v = read();
G[u].push_back(v);
G[v].push_back(u);
}
dfs1(1,0);
dfs2(1,1);
while(m--)
{
char op;
scanf(" %c",&op);
if(op == 'Q')
{
int x = read(),y = read();
int res = road_query(x,y);
if(res == inf)
puts("No");
else
puts("Yes");
}
else if(op == 'C')
{
int x = read(),y = read();
war[++cnt] = {x,y};
r_upd(x,y,inf);
}
else
{
int x = read();
r_upd(war[x].first,war[x].second,0);
}
}
return 0;
}