#include <bits/stdc++.h>
using namespace std;
const long long N = 500 * 1000 + 10;
vector<long long> vec[N];
long long last_upd[N], imp[N], par[N], x[N], y[N], num[N], sum[N], ps[N],
    tim[N];
char q[N];
map<pair<long long, long long>, long long> mp;
void mergeM(long long v, long long u) {
  v = par[v];
  u = par[u];
  if (((long long)(vec[v]).size()) < ((long long)(vec[u]).size())) swap(v, u);
  for (long long a : vec[u]) {
    vec[v].push_back(a);
    par[a] = v;
    if (imp[a]) tim[a] = last_upd[u];
    imp[a] = false;
  }
}
void mergeU(long long v, long long u) {
  v = par[v];
  u = par[u];
  if (((long long)(vec[v]).size()) < ((long long)(vec[u]).size())) swap(v, u);
  for (long long a : vec[u]) {
    vec[v].push_back(a);
    par[a] = v;
    num[a] += sum[u];
    num[a] -= sum[v];
  }
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  long long n, m;
  cin >> n >> m;
  for (long long i = (0); i <= (n - 1); i++) {
    vec[i].push_back(i);
    par[i] = i;
  }
  vector<pair<long long, long long> > need;
  for (long long i = (0); i <= (m - 1); i++) {
    cin >> q[i] >> x[i];
    x[i]--;
    if (q[i] == 'U' || q[i] == 'M') cin >> y[i], y[i]--;
    if (q[i] == 'M')
      mergeM(x[i], y[i]);
    else if (q[i] == 'Z') {
      last_upd[par[x[i]]] = i;
      for (long long j = (((long long)(vec[par[x[i]]]).size()) - 1); j >= (0);
           j--) {
        long long v = vec[par[x[i]]][j];
        if (imp[v]) break;
        imp[v] = true;
      }
    } else if (q[i] == 'Q') {
      ps[i] = last_upd[par[x[i]]];
      if (!imp[x[i]]) ps[i] = tim[x[i]];
      need.push_back({ps[i], x[i]});
    }
  }
  for (long long i = (0); i <= (n - 1); i++) {
    vec[i].clear();
    vec[i].push_back(i);
    par[i] = i;
  }
  sort((need).begin(), (need).end());
  long long ind = 0;
  for (long long i = (0); i <= (m - 1); i++) {
    while (ind < ((long long)(need).size()) && need[ind].first == i)
      mp[need[ind]] = num[need[ind].second] + sum[par[need[ind].second]], ind++;
    if (q[i] == 'U')
      mergeU(x[i], y[i]);
    else if (q[i] == 'A')
      sum[par[x[i]]] += ((long long)(vec[par[x[i]]]).size());
    else if (q[i] == 'Q')
      cout << num[x[i]] + sum[par[x[i]]] - mp[{ps[i], x[i]}] << '\n';
  }
  return 0;
}
