#include <bits/stdc++.h>
using namespace std;
const int M = 1000011;
int S[M], dfn[M], ct, n, m, k, f[M], T, s[M];
vector<int> v[M];
long long tag[M * 4], ans[M];
int ff(int x) {
  if (f[x] == x) return x;
  return f[x] = ff(f[x]);
}
struct vv {
  int tag, x, y, k;
} q[M / 2];
int ver[M * 2], nex[M * 2], head[M * 2], cnt;
void add(int x, int y) { ver[++cnt] = y, nex[cnt] = head[x], head[x] = cnt; }
void dfs(int x) {
  s[x] = 1;
  dfn[x] = ++ct;
  for (int i = head[x]; i; i = nex[i]) {
    dfs(ver[i]);
    s[x] += s[ver[i]];
  }
}
void add(int now, int l, int r, int L, int R, int k) {
  if (l >= L && r <= R) {
    tag[now] += k;
    return;
  }
  int mid = (l + r) >> 1;
  if (L <= mid) add(now * 2, l, mid, L, R, k);
  if (R > mid) add(now * 2 + 1, mid + 1, r, L, R, k);
}
long long ask(int now, int l, int r, int k) {
  if (l == r) return tag[now];
  int mid = (l + r) >> 1;
  if (k <= mid)
    return tag[now] + ask(now * 2, l, mid, k);
  else
    return tag[now] + ask(now * 2 + 1, mid + 1, r, k);
}
void mody(int now, int l, int r, int L, int R, int k) {
  if (l >= L && r <= R) {
    tag[now] = k;
    return;
  }
  if (tag[now]) {
    tag[now * 2] = tag[now * 2 + 1] = tag[now];
    tag[now] = 0;
  }
  int mid = (l + r) >> 1;
  if (L <= mid) mody(now * 2, l, mid, L, R, k);
  if (R > mid) mody(now * 2 + 1, mid + 1, r, L, R, k);
}
int Ask(int now, int l, int r, int k) {
  if (l == r || tag[now]) return tag[now];
  int mid = (l + r) >> 1;
  if (k <= mid) return Ask(now * 2, l, mid, k);
  return Ask(now * 2 + 1, mid + 1, r, k);
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++) {
    char c;
    int x, y;
    scanf("\n%c%d", &c, &q[i].x);
    if (c == 'U' || c == 'M') scanf("%d", &q[i].y);
    if (c == 'U') q[i].tag = 0;
    if (c == 'M') q[i].tag = 1;
    if (c == 'A') q[i].tag = 2;
    if (c == 'Z') q[i].tag = 3;
    if (c == 'Q') q[i].tag = 4;
  }
  for (int i = 1; i <= n + m; i++) f[i] = i;
  int N = n;
  for (int i = 1; i <= m; i++) {
    if (q[i].tag != 1) continue;
    int x = q[i].x, y = q[i].y;
    N += 1;
    add(N, ff(x)), add(N, ff(y));
    f[ff(x)] = f[ff(y)] = N;
  }
  for (int i = N; i >= 1; i--)
    if (!dfn[i]) dfs(i);
  for (int i = 1; i <= n + m; i++) f[i] = i;
  N = n;
  for (int i = 1; i <= m; i++) {
    int x = q[i].x, y = q[i].y;
    if (q[i].tag == 1) {
      N++;
      f[ff(x)] = f[ff(y)] = N;
    }
    if (q[i].tag == 3) {
      x = ff(x);
      mody(1, 1, n + m, dfn[x], dfn[x] + s[x] - 1, i);
    }
    if (q[i].tag == 4) {
      y = Ask(1, 1, n + m, dfn[x]);
      v[y].push_back(i);
    }
  }
  memset(nex, 0, sizeof(nex));
  memset(head, 0, sizeof(head));
  memset(tag, 0, sizeof(tag));
  memset(dfn, 0, sizeof(dfn));
  cnt = ct = 0;
  N = n;
  for (int i = 1; i <= n + m; i++) f[i] = i;
  for (int i = 1; i <= n; i++) S[i] = 1;
  for (int i = 1; i <= m; i++) {
    if (q[i].tag != 0) continue;
    int x = q[i].x, y = q[i].y;
    N += 1;
    add(N, ff(x)), add(N, ff(y));
    f[ff(x)] = f[ff(y)] = N;
  }
  for (int i = N; i >= 1; i--)
    if (!dfn[i]) dfs(i);
  for (int i = 1; i <= n + m; i++) f[i] = i;
  N = n;
  for (int i = 1; i <= m; i++) {
    int x = q[i].x, y = q[i].y;
    if (q[i].tag == 0) {
      N++;
      S[N] = S[ff(x)] + S[ff(y)];
      f[ff(x)] = f[ff(y)] = N;
    }
    if (q[i].tag == 2) {
      x = ff(x);
      add(1, 1, n + m, dfn[x], dfn[x] + s[x] - 1, S[x]);
    }
    if (q[i].tag == 4) ans[i] += ask(1, 1, n + m, dfn[x]);
    for (auto j : v[i]) {
      ans[j] -= ask(1, 1, n + m, dfn[q[j].x]);
    }
  }
  for (int i = 1; i <= m; i++)
    if (q[i].tag == 4) {
      printf("%I64d\n", ans[i]);
    }
}
