#include <bits/stdc++.h>
using namespace std;
long long n, m, fa[5000005], cnt, tot, zhi[2000005], sum[2000005], ans[2000005],
    x[2000005], y[2000005];
long long add[2000005], flag = 0, rt[2000005];
char s[500005][5];
long long getfax(long long aa) {
  if (!fa[aa]) {
    return aa;
  }
  long long kk = getfax(fa[aa]);
  zhi[aa] += zhi[fa[aa]];
  return fa[aa] = kk;
}
long long getfaj(long long aa) {
  if (!fa[aa]) {
    return aa;
  }
  long long kk = getfaj(fa[aa]);
  zhi[aa] = max(zhi[aa], zhi[fa[aa]]);
  return fa[aa] = kk;
}
struct node {
  long long id, bj, rt;
} l[500005], r[500005];
bool cmp(node aa, node bb) { return aa.bj < bb.bj; }
int main() {
  scanf("%lld%lld", &n, &m);
  cnt = n;
  for (long long i = 1; i <= m; ++i) {
    scanf("%s", s[i]);
    if (s[i][0] == 'M') {
      scanf("%lld%lld", &x[i], &y[i]);
      if (!rt[x[i]]) rt[x[i]] = x[i];
      if (!rt[y[i]]) rt[y[i]] = y[i];
      ++cnt;
      fa[rt[y[i]]] = cnt;
      fa[rt[x[i]]] = cnt;
      rt[x[i]] = cnt;
    } else if (s[i][0] == 'Z') {
      scanf("%lld", &x[i]);
      if (!rt[x[i]]) rt[x[i]] = x[i];
      zhi[rt[x[i]]] = i;
    } else if (s[i][0] == 'Q') {
      scanf("%lld", &x[i]);
      getfaj(x[i]);
      l[++tot].bj = zhi[x[i]];
      l[tot].rt = x[i];
      l[tot].id = tot;
      r[tot].bj = i;
      r[tot].rt = x[i];
      r[tot].id = tot;
    } else if (s[i][0] == 'U')
      scanf("%lld%lld", &x[i], &y[i]);
    else if (s[i][0] == 'A')
      scanf("%lld", &x[i]);
  }
  cnt = n;
  sort(l + 1, l + tot + 1, cmp);
  sort(r + 1, r + tot + 1, cmp);
  memset(fa, 0, sizeof(fa));
  memset(zhi, 0, sizeof(zhi));
  memset(add, 0, sizeof(add));
  memset(rt, 0, sizeof(rt));
  long long ll = 1, rr = 1;
  for (long long i = 1; i <= n; ++i) sum[i] = 1;
  for (long long i = 0; i <= m; ++i) {
    if (s[i][0] == 'U') {
      cnt++;
      if (!rt[x[i]]) rt[x[i]] = x[i];
      if (!rt[y[i]]) rt[y[i]] = y[i];
      zhi[rt[x[i]]] = add[rt[x[i]]];
      add[rt[x[i]]] = 0;
      zhi[rt[y[i]]] = add[rt[y[i]]];
      add[rt[y[i]]] = 0;
      sum[cnt] = sum[rt[x[i]]] + sum[rt[y[i]]];
      fa[rt[x[i]]] = cnt;
      fa[rt[y[i]]] = cnt;
      rt[x[i]] = cnt;
    } else if (s[i][0] == 'A') {
      if (!rt[x[i]]) rt[x[i]] = x[i];
      add[rt[x[i]]] += sum[rt[x[i]]];
    }
    while (l[ll].bj == i && ll <= tot) {
      long long kk = getfax(l[ll].rt);
      ans[l[ll].id] -= (zhi[l[ll].rt] + add[kk]);
      ll++;
    }
    while (r[rr].bj == i && rr <= tot) {
      long long kk = getfax(r[rr].rt);
      ans[r[rr].id] += (zhi[r[rr].rt] + add[kk]);
      rr++;
    }
  }
  for (long long i = 1; i <= tot; ++i) printf("%lld\n", ans[i]);
  return 0;
}
