#include <bits/stdc++.h>
using namespace std;
#define MAXN 100013
int N, Q;
struct node {
node *c[2], *p;
bool flip;
bool r() { return !p || (this != p->c[0] && this != p->c[1]); }
int d() { return r() ? -1 : this == p->c[1]; }
void push() {
if (flip) {
swap(c[0], c[1]);
if (c[0]) c[0]->flip ^= 1;
if (c[1]) c[1]->flip ^= 1;
flip ^= 1;
}
}
static void connect(node* pa, node* ch, int d) {
if (d != -1) pa->c[d] = ch;
if (ch) ch->p = pa;
}
void rot() {
assert(!r());
node* pa = p;
int x = d();
connect(pa->p, this, pa->d());
connect(pa, c[!x], x);
connect(this, pa, !x);
}
void splay() {
while (!r() && !p->r()) {
p->p->push();
p->push();
push();
if (p->d() == d()) p->rot();
else rot();
rot();
}
if (!r()) {
p->push();
push();
rot();
}
push();
}
void expose() {
node* pre = nullptr;
for (node* v = this; v; v = v->p) {
v->splay();
v->c[1] = pre;
pre = v;
}
splay();
}
void make_root() {
expose();
flip ^= 1;
}
} verts[MAXN];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> N >> Q;
while (Q--) {
string s; cin >> s;
int a, b;
cin >> a >> b;
--a, --b;
if (s[0] == 'c') {
if (a == b)
cout << "YES\n";
else {
verts[a].expose();
verts[b].expose();
cout << (verts[a].p ? "YES" : "NO") << '\n';
}
}
else if (s[0] == 'a') {
verts[a].make_root();
verts[a].p = &verts[b];
}
else {
verts[a].make_root();
verts[b].expose();
verts[b].c[0] = nullptr;
verts[a].p = nullptr;
}
}
cout.flush();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKI2RlZmluZSBNQVhOIDEwMDAxMwppbnQgTiwgUTsKIApzdHJ1Y3Qgbm9kZSB7Cglub2RlICpjWzJdLCAqcDsKCWJvb2wgZmxpcDsKIAoJYm9vbCByKCkgeyByZXR1cm4gIXAgfHwgKHRoaXMgIT0gcC0+Y1swXSAmJiB0aGlzICE9IHAtPmNbMV0pOyB9CglpbnQgZCgpIHsgcmV0dXJuIHIoKSA/IC0xIDogdGhpcyA9PSBwLT5jWzFdOyB9CiAKCXZvaWQgcHVzaCgpIHsKCQlpZiAoZmxpcCkgewoJCQlzd2FwKGNbMF0sIGNbMV0pOwoJCQlpZiAoY1swXSkgY1swXS0+ZmxpcCBePSAxOwoJCQlpZiAoY1sxXSkgY1sxXS0+ZmxpcCBePSAxOwoJCQlmbGlwIF49IDE7CgkJfQoJfQogCglzdGF0aWMgdm9pZCBjb25uZWN0KG5vZGUqIHBhLCBub2RlKiBjaCwgaW50IGQpIHsKCQlpZiAoZCAhPSAtMSkgcGEtPmNbZF0gPSBjaDsKCQlpZiAoY2gpIGNoLT5wID0gcGE7Cgl9CiAKCXZvaWQgcm90KCkgewoJCWFzc2VydCghcigpKTsKIAoJCW5vZGUqIHBhID0gcDsKCQlpbnQgeCA9IGQoKTsKIAoJCWNvbm5lY3QocGEtPnAsIHRoaXMsIHBhLT5kKCkpOwoJCWNvbm5lY3QocGEsIGNbIXhdLCB4KTsKCQljb25uZWN0KHRoaXMsIHBhLCAheCk7Cgl9CiAKCXZvaWQgc3BsYXkoKSB7CgkJd2hpbGUgKCFyKCkgJiYgIXAtPnIoKSkgewoJCQlwLT5wLT5wdXNoKCk7CgkJCXAtPnB1c2goKTsKCQkJcHVzaCgpOwoJCQlpZiAocC0+ZCgpID09IGQoKSkgcC0+cm90KCk7CgkJCWVsc2Ugcm90KCk7CgkJCXJvdCgpOwoJCX0KCQlpZiAoIXIoKSkgewoJCQlwLT5wdXNoKCk7CgkJCXB1c2goKTsKCQkJcm90KCk7CgkJfQoJCXB1c2goKTsKCX0KIAoJdm9pZCBleHBvc2UoKSB7CgkJbm9kZSogcHJlID0gbnVsbHB0cjsKCQlmb3IgKG5vZGUqIHYgPSB0aGlzOyB2OyB2ID0gdi0+cCkgewoJCQl2LT5zcGxheSgpOwoJCQl2LT5jWzFdID0gcHJlOwoJCQlwcmUgPSB2OwoJCX0KCQlzcGxheSgpOwoJfQogCgl2b2lkIG1ha2Vfcm9vdCgpIHsKCQlleHBvc2UoKTsKCQlmbGlwIF49IDE7Cgl9CiAKfSB2ZXJ0c1tNQVhOXTsKIAppbnQgbWFpbigpIHsKCWlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwoJY2luLnRpZSgwKTsKIAoJY2luID4+IE4gPj4gUTsKIAoJd2hpbGUgKFEtLSkgewoJCXN0cmluZyBzOyBjaW4gPj4gczsKCQlpbnQgYSwgYjsKCQljaW4gPj4gYSA+PiBiOwoJCS0tYSwgLS1iOwoJCWlmIChzWzBdID09ICdjJykgewoJCQlpZiAoYSA9PSBiKQoJCQkJY291dCA8PCAiWUVTXG4iOwoJCQllbHNlIHsKCQkJCXZlcnRzW2FdLmV4cG9zZSgpOwoJCQkJdmVydHNbYl0uZXhwb3NlKCk7CgkJCQljb3V0IDw8ICh2ZXJ0c1thXS5wID8gIllFUyIgOiAiTk8iKSA8PCAnXG4nOwoJCQl9CgkJfQoJCWVsc2UgaWYgKHNbMF0gPT0gJ2EnKSB7CgkJCXZlcnRzW2FdLm1ha2Vfcm9vdCgpOwoJCQl2ZXJ0c1thXS5wID0gJnZlcnRzW2JdOwoJCX0KCQllbHNlIHsKCQkJdmVydHNbYV0ubWFrZV9yb290KCk7CgkJCXZlcnRzW2JdLmV4cG9zZSgpOwoJCQl2ZXJ0c1tiXS5jWzBdID0gbnVsbHB0cjsKCQkJdmVydHNbYV0ucCA9IG51bGxwdHI7CgkJfQoJfQogCgljb3V0LmZsdXNoKCk7CglyZXR1cm4gMDsKfQo=