#include <bits/stdc++.h>
using namespace std;
namespace p {
int fa[500005], sz[500005], mg[500005], cl[500005];
int g(int a) { return (fa[a] == a ? a : g(fa[a])); }
void join(int a, int b, int t) {
  a = g(a);
  b = g(b);
  if (sz[a] < sz[b]) swap(a, b);
  fa[b] = a;
  sz[a] += sz[b];
  mg[b] = t;
}
void clear(int a, int t) {
  a = g(a);
  cl[a] = t;
}
int qry(int a) {
  int t = cl[a];
  while (fa[a] != a) {
    if (mg[a] <= cl[fa[a]]) t = cl[fa[a]];
    a = fa[a];
  }
  return t;
}
}  // namespace p
struct ope {
  int tp, a, b, c, time;
  bool operator<(const ope y) const {
    return time < y.time || (time == y.time && tp > y.tp);
  }
} op[1000005];
int tot;
namespace u {
int fa[500005], sz[500005];
long long v[500005];
int g(int a) { return (fa[a] == a ? a : g(fa[a])); }
void join(int a, int b) {
  a = g(a);
  b = g(b);
  if (sz[a] < sz[b]) swap(a, b);
  fa[b] = a;
  sz[a] += sz[b];
  v[b] -= v[a];
}
void add(int a) {
  a = g(a);
  v[a] += sz[a];
}
long long qry(int a) {
  long long r = v[a];
  while (fa[a] != a) r += v[a = fa[a]];
  return r;
}
}  // namespace u
char s[2];
long long ans[500005];
int cnt;
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) p::fa[i] = u::fa[i] = i, p::sz[i] = u::sz[i] = 1;
  for (int i = 1; i <= m; i++) {
    scanf("%s", s);
    if (s[0] == 'U') {
      op[++tot].tp = 0;
      scanf("%d%d", &op[tot].a, &op[tot].b);
      op[tot].time = i;
    } else if (s[0] == 'M') {
      int a, b;
      scanf("%d%d", &a, &b);
      p::join(a, b, i);
    } else if (s[0] == 'A') {
      op[++tot].tp = 1;
      scanf("%d", &op[tot].a);
      op[tot].time = i;
    } else if (s[0] == 'Z') {
      int a;
      scanf("%d", &a);
      p::clear(a, i);
    } else if (s[0] == 'Q') {
      int a;
      scanf("%d", &a);
      int w = p::qry(a);
      assert(w <= i);
      cnt++;
      op[++tot] = (ope){2, a, -1, cnt, w};
      op[++tot] = (ope){2, a, 1, cnt, i};
    }
  }
  sort(op + 1, op + tot + 1);
  for (int i = 1; i <= tot; i++) {
    if (op[i].tp == 0) u::join(op[i].a, op[i].b);
    if (op[i].tp == 1) u::add(op[i].a);
    if (op[i].tp == 2) {
      long long r = u::qry(op[i].a);
      ans[op[i].c] += op[i].b * r;
    }
  }
  for (int i = 1; i <= cnt; i++) printf("%lld\n", ans[i]);
}
