#include<bits/stdc++.h>
using namespace std;
#define int long long
const int inf=0x7fffffff;
struct node{
int fa,b,le,re,num,bj;
}tree[10000005];
struct nid{
int to,next;
}ma[100000005];
int n,m,cnt,ans;
string hh;
void pushdo(int r){
if(tree[r].bj){
tree[r].bj=0;
tree[tree[r].le].bj^=1;
tree[tree[r].re].bj^=1;
swap(tree[r].le,tree[r].re);
}
}
void zid(int x){
int y=tree[x].fa,z=tree[y].fa;
if(tree[y].b){
if(tree[z].le==y)tree[z].le=x;
else tree[z].re=x;
}
else tree[x].b=0,tree[y].b=1;
int l=(tree[y].le!=x),r=l^1;
tree[x].fa=z;
if(l){
tree[y].re=tree[x].le;tree[x].le=y;
}
else {
tree[y].le=tree[x].re;tree[x].re=y;
}
}
void s(int x){
int y,z;
pushdo(x);
while(tree[x].b){
y=tree[x].fa,z=tree[y].fa;
if(tree[y].b)pushdo(z);
pushdo(x),pushdo(y);
if(tree[y].b){
if((tree[y].le==x)^(tree[z].le==y))zid(x);
else zid(y);
}
zid(x);
}
}
void ac(int x){
int y=0;
while(x){
s(x);
tree[tree[x].re].b=0;
if(y){
tree[y].fa=x;
tree[y].b=1;
}
tree[x].re=y;
y=x;
x=tree[x].fa;
}
}
void e(int x){
ac(x);
s(x);
tree[x].b^=1;
}
void add(int x,int y){
e(y);
tree[y].fa=x;
}
void cut(int x,int y){
e(y);
ac(x);
s(x);
tree[y].fa=0;
tree[y].b=0;
tree[x].le=0;
}
int find(int x){
ac(x);
s(x);
while(tree[x].le)x=tree[x].le,pushdo(x);
return x;
}
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1,a,b;i<=m;i++){
cin>>hh;
scanf("%lld%lld",&a,&b);
if(hh[1]=='o')add(a,b);
else if(hh[1]=='e')cut(a,b);
else {
if(find(a)==find(b))printf("Yes\n");
else printf("No\n");
}
}
return 0;
}