#include<bits/stdc++.h>
#define N 10005
#define inf 1000000000
#define ll long long
using namespace std;
int read(){
int x=0,f=1;char ch=getchar();
while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
return x*f;
}
namespace LCT{
int ch[N][2],fa[N];bool rev[N];
inline bool isroot(int x){
if(ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x)return 1;return 0;
}
inline void pushdown(int x){
if(rev[x]){
rev[ch[x][0]]^=1;rev[ch[x][1]]^=1;rev[x]=0;
swap(ch[x][0],ch[x][1]);
}
}
void Pushdown(int x){
if(!isroot(x))Pushdown(fa[x]);//splay中是否是根
pushdown(x);
}
void rotate(int x){
int y=fa[x],k=ch[y][1]==x;
if(!isroot(y))ch[fa[y]][ch[fa[y]][1]==y]=x;
fa[x]=fa[y];
fa[y]=x;
fa[ch[x][!k]]=y;
ch[y][k]=ch[x][!k];
ch[x][!k]=y;
}
void splay(int x){
Pushdown(x);
for(int y=fa[x];!isroot(x);y=fa[x]){
if(!isroot(y)){
if((ch[fa[y]][1]==y)!=(ch[y][1]==x))rotate(x);
else rotate(y);
}rotate(x);
}
}
inline void access(int x){
int y=0;
while(x){
splay(x);
ch[x][1]=y;
x=fa[y=x];
}
}
inline void moveroot(int x){
access(x);splay(x);rev[x]^=1;
}
inline void link(int x,int y){
moveroot(x);fa[x]=y;splay(x);
}
inline void cut(int x,int y){
moveroot(x);access(y);splay(y);ch[y][0]=fa[x]=0;
}
inline int find(int x){
access(x);splay(x);
while(ch[x][0]){
x=ch[x][0];
pushdown(x);
}
return x;
}
}
int n,m;
char ch[10];
int main(){
n=read();m=read();
while(m--){
scanf("%s",ch);
int x=read(),y=read();
if(ch[0]==‘C‘)LCT::link(x,y);
else if(ch[0]==‘D‘)LCT::cut(x,y);
else if(LCT::find(x)==LCT::find(y))printf("Yes\n");else printf("No\n");
}
return 0;
}