#include <bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define fi first
#define se second
const int N = 2e5+5;
const int lg = 18;
int n,q,ans[N],bits[N],st[N][lg],h[N],par[N][2],sz[N],del[N],val[N];
vector<pii>adj[N],qr2[N];
vector<tuple<int,int,int>>qr1[N];
vector<int>upd,full;
bool cmp(pii a, pii b){
return a.se > b.se;
}
void update(int u, int val){
while(u <= n){
bits[u] += val;
u += u & (-u);
}
}
int get(int u){
int res = 0;
while(u > 0){
res += bits[u];
u -= u & (-u);
}
return res;
}
void dfs(int u, int p, int cur1, int cur2){
h[u] = h[p]+1;
st[u][0] = p;
for(int i = 1; i < lg; i++) st[u][i] = st[st[u][i-1]][i-1];
for(auto[v,w]: adj[u]){
if(v != p){
if(cur1 > w) par[v][0] = par[u][0];
else par[v][0] = u;
if(cur2 < w) par[v][1] = par[u][1];
else par[v][1] = u;
val[v] = w;
dfs(v,u,w,w);
}
}
}
int lca(int u, int v){
if(h[u] < h[v]) swap(u,v);
for(int i = lg-1; i >= 0; i--){
if(h[st[u][i]] >= h[v]){
u = st[u][i];
}
}
if(u == v) return u;
for(int i = lg-1; i >= 0; i--){
if(st[u][i] != st[v][i]){
u = st[u][i];
v = st[v][i];
}
}
return st[u][0];
}
int cal(int u, int p){
sz[u] = 1;
for(auto[v,w]: adj[u]){
if(v != p && !del[v]) sz[u] += cal(v,u);
}
return sz[u];
}
int find_cent(int u, int p, int tot){
for(auto[v,w]: adj[u]){
if(v != p && !del[v] && sz[v] > tot/2) return find_cent(v,u,tot);
}
return u;
}
int cur;
void missu(int u, int p, int c, bool tang, bool giam){
if(tang){
upd.push_back(c);
full.push_back(c);
}
if(giam){
for(auto[id,t]: qr2[u]){
ans[id] += get(t);
if(cur <= t) ans[id]++;
}
}
for(auto[v,w]: adj[u]){
if(v != p && !del[v]){
int ngiam = giam;
int ntang = tang;
if(c < w) ngiam = false;
if(c > w) ntang = false;
missu(v,u,w,ntang,ngiam);
}
}
}
void decompose(int u){
int cent = find_cent(u,0,cal(u,0));
del[cent] = true;
sort(adj[cent].begin(),adj[cent].end(),cmp);
for(auto[v,w]: adj[cent]){
if(!del[v]){
cur = w;
missu(v,u,w,1,1);
for(auto it: upd) update(it,1);
upd.clear();
}
}
for(auto[id,t]: qr2[cent]){
ans[id] += get(t);
}
for(auto it: full) update(it,-1);
full.clear();
for(auto[v,w]: adj[cent]){
if(!del[v]) decompose(v);
}
}
int jump(int u, int v){
for(int i = lg-1; i >= 0; i--){
if(h[st[u][i]] > h[v]) u = st[u][i];
}
return u;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> q;
int time = 0;
int qr = 0;
for(int i = 1; i <= n+q-1; i++){
char x;
cin >> x;
if(x == 'S'){
int u,v;
cin >> u >> v;
time++;
adj[u].push_back({v,time});
adj[v].push_back({u,time});
}
else if(x == 'Q'){
int a,d;
cin >> a >> d;
qr++;
qr1[d].push_back({qr,a,time});
}
else{
int u;
cin >> u;
qr++;
qr2[u].push_back({qr,time});
}
}
par[1][0] = par[1][1] = 1;
dfs(1,0,1e9,0);
decompose(1);
for(int i = 1; i <= n; i++){
for(auto[id,a,time]: qr1[i]){
int cc = lca(i,a);
if(cc == i){
int x = par[a][1];
int v1 = val[a];
if(h[x] <= h[cc] && v1 <= time) ans[id] = -1;
else ans[id] = -2;
}
else if(cc == a){
int y = par[i][0];
int v2 = val[jump(i,a)];
if(h[y] <= h[cc] && v2 <= time) ans[id] = -1;
else ans[id] = -2;
}
else{
int x = par[i][0];
int y = par[a][1];
int v1 = jump(i,cc);
int v2 = jump(a,cc);
if(h[x] <= h[cc] && h[y] <= h[cc] && val[v1] < val[v2] && val[a] <= time) ans[id] = -1;
else ans[id] = -2;
}
}
}
for(int i = 1; i <= q; i++){
if(ans[i] == -1) cout << "yes" << "\n";
else if(ans[i] == -2) cout << "no" << "\n";
else cout << ans[i]+1 << "\n";
}
}