#include <bits/stdc++.h>
using namespace std;
int n, m;
struct BIT {
  long long val[500005];
  void add(int x, int w) {
    for (; x <= m; x += x & -x) val[x] += w;
    return;
  }
  long long sum(int x) {
    long long sum = 0;
    for (; x; x -= x & -x) sum += val[x];
    return sum;
  }
  long long query(int l, int r) { return sum(r) - sum(l - 1); }
} T;
struct DSU {
  int fa[500005 << 1], val[500005 << 1];
  void init() {
    for (int i = 1; i <= n * 2; ++i) fa[i] = i, val[i] = 1;
    return;
  }
  int find(int x) {
    if (fa[x] == x) return x;
    int p = find(fa[x]);
    val[x] = max(val[x], val[fa[x]]);
    return fa[x] = p;
  }
  void merge(int x, int y) {
    fa[find(x)] = find(y);
    return;
  }
} D;
int fa[500005], sz[500005], id[500005];
long long ans[500005];
vector<pair<int, int> > op[500005], son[500005], qu[500005];
int read();
void dfs(int);
int main() {
  n = read(), m = read();
  D.init();
  int cnt = n;
  for (int i = 1; i <= n; ++i) id[i] = i, sz[i] = 1;
  for (int i = 1; i <= m; ++i) {
    char ch = getchar();
    int x = read(), y;
    if (ch == 'U')
      fa[y = read()] = x, son[x].push_back(make_pair(y, i)), sz[x] += sz[y];
    if (ch == 'M') {
      y = read();
      ++cnt;
      D.merge(id[x], cnt);
      D.merge(id[y], cnt);
      id[x] = cnt;
    }
    if (ch == 'A') op[x].push_back(make_pair(sz[x], i));
    if (ch == 'Z') D.val[id[x]] = i;
    if (ch == 'Q') {
      D.find(x), qu[x].push_back(make_pair(i, D.val[x]));
    }
  }
  memset(ans, -1, sizeof ans);
  for (int i = 1; i <= n; ++i)
    if (!fa[i]) dfs(i);
  for (int i = 1; i <= m; ++i)
    if (ans[i] != -1) printf("%lld\n", ans[i]);
  return 0;
}
int read() {
  int x = 0;
  char ch = getchar();
  for (; !isdigit(ch); ch = getchar())
    ;
  for (; isdigit(ch); ch = getchar()) x = x * 10 + (ch ^ 48);
  return x;
}
void dfs(int u) {
  int sz1 = son[u].size(), sz2 = op[u].size(), pos = sz2 - 1;
  for (int i = sz1 - 1; ~i; --i) {
    int tm = son[u][i].second, v = son[u][i].first;
    while (~pos && op[u][pos].second > tm)
      T.add(op[u][pos].second, op[u][pos].first), --pos;
    dfs(v);
  }
  while (~pos) T.add(op[u][pos].second, op[u][pos].first), --pos;
  int sz3 = qu[u].size();
  for (int i = 0; i < sz3; ++i)
    ans[qu[u][i].first] = T.query(qu[u][i].second, qu[u][i].first);
  for (int i = 0; i < sz2; ++i) T.add(op[u][i].second, -op[u][i].first);
  return;
}
