#include <bits/stdc++.h>
using namespace std;
const int iinf = 0x3f3f3f3f;
const long long linf = 0x3f3f3f3f3f3f3f3f;
const int N = 5e5;
int n, qn, last[N];
long long ans[N];
vector<int> ask[N];
set<int> zi;
long long fwt[N];
void add(int i, long long v) {
  for (; i < qn; i |= i + 1) fwt[i] += v;
}
long long sum(int i) {
  long long v = 0;
  for (; ~i; i &= i + 1, i--) v += fwt[i];
  return v;
}
const int nN = N << 1;
struct dsu {
  int te[nN], sz[nN], cn;
  vector<int> e[nN], opn[nN];
  void init() { cn = 0, iota(te, te + n, 0), fill(sz, sz + n, 1); }
  int find(int u) { return te[u] == u ? u : (te[u] = find(te[u])); }
  void merge(int u, int v) {
    u = find(u), v = find(v);
    if (u == v) return;
    int rt = n + (cn++);
    te[rt] = rt, sz[rt] = sz[u] + sz[v];
    te[u] = te[v] = rt, e[rt].push_back(u), e[rt].push_back(v);
  }
  void dfs0(int u, int fa) {
    for (int i : opn[u]) zi.insert(i);
    if (u < n)
      for (int i : ask[u]) last[i] = *prev(zi.lower_bound(i));
    else
      for (int v : e[u])
        if (v != fa) dfs0(v, u);
    for (int i : opn[u]) zi.erase(i);
  }
  void dfs1(int u, int fa) {
    for (int i : opn[u]) add(i, +sz[u]);
    if (u < n)
      for (int i : ask[u]) ans[i] = sum(i) - sum(last[i]);
    else
      for (int v : e[u])
        if (v != fa) dfs1(v, u);
    for (int i : opn[u]) add(i, -sz[u]);
  }
} a, b;
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0), cout.tie(0);
  cin >> n >> qn;
  fill(ans, ans + qn, -1), a.init(), b.init();
  for (int i = (0), I = (qn); i < I; i++) {
    char c;
    int first, second;
    cin >> c;
    if (c == 'U')
      cin >> first >> second, --first, --second, a.merge(first, second);
    else if (c == 'M')
      cin >> first >> second, --first, --second, b.merge(first, second);
    else if (c == 'A')
      cin >> first, --first, a.opn[a.find(first)].push_back(i);
    else if (c == 'Z')
      cin >> first, --first, b.opn[b.find(first)].push_back(i);
    else if (c == 'Q')
      cin >> first, --first, ask[first].push_back(i);
  }
  zi.insert(-1);
  for (int i = (0), I = (n + b.cn); i < I; i++)
    if (b.find(i) == i) b.dfs0(i, -1);
  for (int i = (0), I = (n + a.cn); i < I; i++)
    if (a.find(i) == i) a.dfs1(i, -1);
  for (int i = (0), I = (qn); i < I; i++)
    if (~ans[i]) cout << ans[i] << '\n';
  return 0;
}
