#include <bits/stdc++.h>
using namespace std;
int n, m, V1, V2;
char type[1511111];
int x[1511111], y[1511111];
int in1[1511111], in2[1511111], out1[1511111], out2[1511111];
int n1[1511111], n2[1511111];
int par1[1511111], par2[1511111];
pair<int, int> chi1[1511111], chi2[1511111];
long long su[1511111], ans[1511111];
vector<int> po[1511111];
int T;
int tz[1511111];
void add(int x, int v) {
  while (x < n) {
    su[x] += v;
    x |= (x + 1);
  }
}
long long fin(int x) {
  long long r = 0;
  while (x >= 0) {
    r += su[x];
    x = (x & (x + 1)) - 1;
  }
  return r;
}
void go1(int x) {
  in1[x] = T;
  if (x < n)
    T++;
  else {
    go1(chi1[x].first);
    go1(chi1[x].second);
  }
  out1[x] = T - 1;
}
void go2(int x) {
  in2[x] = T;
  if (x < n)
    T++;
  else {
    go2(chi2[x].first);
    go2(chi2[x].second);
  }
  out2[x] = T - 1;
}
int main() {
  scanf("%d%d\n", &n, &m);
  for (int i = 0; i < m; i++) {
    scanf("%c", &type[i]);
    if (type[i] == 'A' || type[i] == 'Z' || type[i] == 'Q') {
      scanf("%d\n", &x[i]);
      x[i]--;
    } else {
      scanf("%d%d\n", &x[i], &y[i]);
      x[i]--;
      y[i]--;
    }
  }
  V1 = V2 = n;
  for (int i = 0; i < n; i++) {
    n1[i] = n2[i] = i;
  }
  for (int i = 0; i < m; i++) {
    if (type[i] == 'U') {
      chi1[V1] = make_pair(n1[x[i]], n1[y[i]]);
      par1[n1[x[i]]] = V1;
      par1[n1[y[i]]] = V1;
      n1[x[i]] = V1;
      n1[y[i]] = V1;
      V1++;
    }
    if (type[i] == 'M') {
      chi2[V2] = make_pair(n2[x[i]], n2[y[i]]);
      par2[n2[x[i]]] = V2;
      par2[n2[y[i]]] = V2;
      n2[x[i]] = V2;
      n2[y[i]] = V2;
      V2++;
    }
    if (type[i] == 'Z') {
      tz[i] = n2[x[i]];
    }
  }
  T = 0;
  for (int i = 0; i < V1; i++)
    if (par1[i] == 0) go1(i);
  T = 0;
  for (int i = 0; i < V2; i++)
    if (par2[i] == 0) go2(i);
  set<pair<int, int> > Q;
  set<pair<int, int> >::iterator it, it2;
  for (int i = m - 1; i >= 0; i--) {
    if (type[i] == 'Q') {
      Q.insert(make_pair(in2[x[i]], i));
    }
    if (type[i] == 'Z') {
      int A = in2[tz[i]];
      int B = out2[tz[i]];
      it = Q.lower_bound(make_pair(A, 0));
      while (it != Q.end() && (it->first) <= B) {
        po[i].push_back(it->second);
        it2 = it;
        it++;
        Q.erase(it2);
      }
    }
  }
  for (int i = 0; i < n; i++) {
    n1[i] = i;
  }
  for (int i = 0; i < m; i++) {
    if (type[i] == 'U') {
      n1[x[i]] = par1[n1[x[i]]];
      n1[y[i]] = par1[n1[y[i]]];
    }
    if (type[i] == 'A') {
      int sz = out1[n1[x[i]]] - in1[n1[x[i]]] + 1;
      add(in1[n1[x[i]]], sz);
      add(out1[n1[x[i]]] + 1, -sz);
    }
    for (int j = 0; j < po[i].size(); j++) {
      int v = in1[x[po[i][j]]];
      ans[po[i][j]] -= fin(v);
    }
    if (type[i] == 'Q') {
      int v = in1[x[i]];
      ans[i] += fin(v);
    }
  }
  for (int i = 0; i < m; i++)
    if (type[i] == 'Q') printf("%I64d\n", ans[i]);
  return 0;
}
