#include<cstdio>
#include<iostream>
using namespace std;
int shu[][],n,m,fa[],st[];
bool rev[];
bool isroot(int a1)
{
return shu[fa[a1]][]!=a1&&shu[fa[a1]][]!=a1;
}
void pushdown(int a1)
{
int l=shu[a1][],r=shu[a1][];
if(rev[a1])
{
rev[a1]^=;
rev[l]^=;
rev[r]^=;
swap(shu[a1][],shu[a1][]);
}
}
void zhuan(int a1)
{
int y=fa[a1],z=fa[y],l,r;
if(shu[y][]==a1)
l=;
else
l=;
r=l^;
if(!isroot(y))
if(shu[z][]==y)
shu[z][]=a1;
else
shu[z][]=a1;
fa[a1]=z;
fa[y]=a1;
shu[y][l]=shu[a1][r];
fa[shu[y][l]]=y;
shu[a1][r]=y;
}
void splay(int a1)
{
int top=;
top++;
st[top]=a1;
for(int i=a1;!isroot(i);i=fa[i])
{
top++;
st[top]=fa[i];
}
for(int i=top;i;i--)
pushdown(st[i]);
for(;!isroot(a1);)
{
int y=fa[a1],z=fa[a1];
if(!isroot(y))
if(y==shu[z][]^a1==shu[y][])
zhuan(a1);
else
zhuan(y);
zhuan(a1);
}
}
void access(int a1)
{
int t=;
for(;a1;)
{
splay(a1);
shu[a1][]=t;
t=a1;
a1=fa[a1];
}
}
void gen(int a1)
{
access(a1);
splay(a1);
rev[a1]^=;
}
void lian(int a1,int a2)
{
gen(a1);
fa[a1]=a2;
splay(a1);
}
void cut(int a1,int a2)
{
gen(a1);
access(a2);
splay(a2);
shu[a2][]=fa[a1]=;
}
int find(int a1)
{
access(a1);
splay(a1);
int y;
for(y=a1;shu[y][];y=shu[y][]);
return y;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<m;i++)
{
int a1,a2;
char ch[];
scanf("%s%d%d",ch,&a1,&a2);
if(ch[]=='C')
lian(a1,a2);
if(ch[]=='D')
cut(a1,a2);
if(ch[]=='Q')
{
int a3,a4;
a3=find(a1);
a4=find(a2);
if(a3==a4)
printf("Yes\n");
else
printf("No\n");
}
}
return ;
}
link-cut-tree