#include <bits/stdc++.h>
using namespace std;
const int TR = (1 << 21) + 3;
const int N = 5e5 + 3;
const int oo = 1e9;
int stp[N], st[N], lv[N], lu[N], pv[N], pu[N], a[N][2], ST, tr_mx[TR], sz;
char s[N];
long long tr[TR];
vector<int> g[N];
pair<int, int> c[N];
long long get(int i, int l, int r, int lt, int rt) {
  if (l > r) return 0;
  if ((l == lt) && (r == rt)) return tr[i];
  long long ans = tr[i];
  int x;
  x = (lt + rt) >> 1;
  ans += get(i << 1, l, min(x, r), lt, x);
  ans += get((i << 1) + 1, max(l, x + 1), r, x + 1, rt);
  return ans;
}
void change(int i, int l, int r, int lt, int rt, long long c) {
  if (l > r) return;
  if ((l == lt) && (r == rt)) {
    tr[i] += c;
    return;
  }
  int x = (lt + rt) >> 1;
  change(i << 1, l, min(r, x), lt, x, c);
  change((i << 1) + 1, max(l, x + 1), r, x + 1, rt, c);
}
int get_mx(int i, int l, int r, int lt, int rt) {
  if (l > r) return -oo;
  if ((l == lt) && (r == rt)) return tr_mx[i];
  int ans = tr_mx[i], x;
  x = (lt + rt) >> 1;
  ans = max(ans, get_mx(i << 1, l, min(x, r), lt, x));
  ans = max(ans, get_mx((i << 1) + 1, max(x + 1, l), r, x + 1, rt));
  return ans;
}
void change_mx(int i, int l, int r, int lt, int rt, int c) {
  if (l > r) return;
  if ((l == lt) && (r == rt)) {
    tr_mx[i] = max(tr_mx[i], c);
    return;
  }
  int x = (lt + rt) >> 1;
  change_mx(i << 1, l, min(r, x), lt, x, c);
  change_mx((i << 1) + 1, max(l, x + 1), r, x + 1, rt, c);
}
void dfs(int i) {
  int u, j;
  st[ST++] = i;
  for (u = 0; u < g[i].size(); ++u) dfs(g[i][u]);
}
int main() {
  int i, n, m, ai, bi, l, r, j, u;
  long long tt;
  scanf("%d%d\n", &n, &m);
  for (i = 0; i < m; ++i) {
    scanf("%c ", &s[i]);
    if ((s[i] == 'U') || (s[i] == 'M')) {
      scanf("%d%d\n", &ai, &bi);
      --ai;
      --bi;
      a[i][0] = ai;
      a[i][1] = bi;
    } else {
      scanf("%d\n", &ai);
      --ai;
      a[i][0] = ai;
    }
  }
  for (i = 0; i < m; ++i) {
    ai = a[i][0];
    bi = a[i][1];
    if (s[i] == 'U') {
      g[ai].push_back(bi);
      ++stp[bi];
    }
  }
  for (i = 0; i < n; ++i) c[i] = make_pair(stp[i], i);
  sort(c, c + n);
  ST = 0;
  for (i = 0; (!c[i].first) && (i < n); ++i) dfs(c[i].second);
  for (i = 0; i < n; ++i) pu[st[i]] = i;
  for (i = 0; i < n; ++i) stp[i] = 0, g[i].clear();
  for (i = 0; i < m; ++i) {
    ai = a[i][0];
    bi = a[i][1];
    if (s[i] == 'M') {
      g[ai].push_back(bi);
      ++stp[bi];
    }
  }
  for (i = 0; i < n; ++i) c[i] = make_pair(stp[i], i);
  sort(c, c + n);
  ST = 0;
  for (i = 0; (!c[i].first) && (i < n); ++i) dfs(c[i].second);
  for (i = 0; i < n; ++i) pv[st[i]] = i;
  for (sz = 1; sz < n; sz <<= 1)
    ;
  for (i = 0; i < (sz << 1); ++i) tr[i] = 0, tr_mx[i] = -1;
  for (i = 0; i < n; ++i) lv[i] = lu[i] = 1;
  for (i = 0; i < m; ++i) g[i].clear();
  for (i = 0; i < m; ++i) {
    ai = a[i][0];
    bi = a[i][1];
    if (s[i] == 'M')
      lv[ai] += lv[bi];
    else if (s[i] == 'Z') {
      l = pv[ai];
      r = l + lv[ai] - 1;
      change_mx(1, l, r, 0, sz - 1, i);
    } else if (s[i] == 'Q') {
      j = get_mx(1, pv[ai], pv[ai], 0, sz - 1);
      if (j != -1) g[j].push_back(ai);
    }
  }
  for (i = 0; i < m; ++i) {
    ai = a[i][0];
    bi = a[i][1];
    if (s[i] == 'U')
      lu[ai] += lu[bi];
    else if (s[i] == 'A') {
      l = pu[ai];
      r = l + lu[ai] - 1;
      change(1, l, r, 0, sz - 1, lu[ai]);
    } else if (s[i] == 'Z') {
      for (u = 0; u < g[i].size(); ++u) {
        j = g[i][u];
        tt = get(1, pu[j], pu[j], 0, sz - 1);
        change(1, pu[j], pu[j], 0, sz - 1, -tt);
      }
    } else if (s[i] == 'Q') {
      cout << get(1, pu[ai], pu[ai], 0, sz - 1) << endl;
    }
  }
  return 0;
}
