#include <bits/stdc++.h>
using namespace std;
const int N = 500500;
struct DSU {
  int a[N];
  int head[N];
  DSU() : a(), head() {}
  void clear() {
    for (int i = 0; i < N; i++) a[i] = head[i] = i;
  }
  int get(int x) {
    if (a[x] == x) return x;
    return a[x] = get(a[x]);
  }
  int get_head(int x) { return head[get(x)]; }
  void unite(int x, int y, int h) {
    x = get(x);
    y = get(y);
    a[x] = y;
    head[y] = h;
  }
};
int n, m;
char op[N];
int arg1[N], arg2[N];
DSU dsu;
vector<int> gr[N];
long long gr_val[N];
int elem_gr[N];
long long elem_val[N];
long long elem_stamp[N];
long long ans[N];
vector<int> sub[N];
long long get_war_val(int e) {
  int g = elem_gr[e];
  if (gr_val[g] == elem_stamp[e]) return elem_val[e];
  return gr_val[g];
}
void war() {
  dsu.clear();
  for (int i = 0; i < n; i++) {
    gr_val[i] = elem_val[i] = elem_stamp[i] = -1;
    elem_gr[i] = i;
    gr[i].push_back(i);
  }
  for (int i = 0; i < m; i++) {
    int a = arg1[i];
    if (op[i] != 'Q') a = dsu.get_head(a);
    if (op[i] == 'M') {
      int b = dsu.get_head(arg2[i]);
      if ((int)gr[a].size() < (int)gr[b].size()) swap(a, b);
      dsu.unite(a, b, a);
      for (int e : gr[b]) {
        elem_val[e] = get_war_val(e);
        elem_stamp[e] = gr_val[a];
        elem_gr[e] = a;
        gr[a].push_back(e);
      }
    }
    if (op[i] == 'Z') {
      gr_val[a] = i;
    }
    if (op[i] == 'Q') {
      int at = get_war_val(a);
      if (at != -1) sub[at].push_back(i);
    }
  }
}
long long get_peace_val(int e) {
  int g = elem_gr[e];
  return elem_val[e] + gr_val[g];
}
void peace() {
  dsu.clear();
  for (int i = 0; i < n; i++) {
    gr_val[i] = elem_val[i] = 0;
    elem_gr[i] = i;
    gr[i].clear();
    gr[i].push_back(i);
  }
  for (int i = 0; i < m; i++) {
    int a = arg1[i];
    if (op[i] != 'Q') a = dsu.get_head(a);
    if (op[i] == 'U') {
      int b = dsu.get_head(arg2[i]);
      if ((int)gr[a].size() < (int)gr[b].size()) swap(a, b);
      dsu.unite(a, b, a);
      for (int e : gr[b]) {
        elem_val[e] = get_peace_val(e) - gr_val[a];
        elem_gr[e] = a;
        gr[a].push_back(e);
      }
    }
    if (op[i] == 'A') {
      gr_val[a] += (int)gr[a].size();
    }
    if (op[i] == 'Q') {
      ans[i] += get_peace_val(a);
    }
    for (int e : sub[i]) {
      ans[e] -= get_peace_val(arg1[e]);
    }
  }
}
void solve() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < m; i++) {
    char buf[5];
    scanf("%s%d", buf, &arg1[i]);
    op[i] = buf[0];
    arg1[i]--;
    if (op[i] == 'U' || op[i] == 'M') {
      scanf("%d", &arg2[i]);
      arg2[i]--;
    }
  }
  war();
  peace();
  for (int i = 0; i < m; i++)
    if (op[i] == 'Q') printf("%lld\n", ans[i]);
}
int main() {
  solve();
  0;
  return 0;
}
