#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll inline read(){
ll w=1,ret=1,c=0;
while((c=getchar())<'0'||c>'9') w=(c=='-'?-1:1);
ret=c-'0';
while((c=getchar())>='0'&&c<='9') ret=ret*10+c-'0';
return ret*w;
}
int const maxn=5e5+5;
int n,m;
ll val[maxn];
struct DSU{
int fa[maxn],sz[maxn];
int find(int x){
if(fa[x]==x) return x;
return find(fa[x]);
}
void merge(int x,int y){
x=find(x),y=find(y);
if(x==y) return;
if(sz[x]>sz[y]){
fa[y]=x;
sz[x]+=sz[y];
}else{
fa[x]=y;
sz[y]+=sz[x];
}
}
void init(){
for(int i=1;i<=n;i++) fa[i]=i,sz[i]=1;
}
}dsu1,dsu2;
struct qry{
char op;
int x,y;
}q[maxn];
struct node{
char op;
int x,y;
int v;
}vec[maxn];
int main(){
n=read(),m=read();
dsu1.init(),dsu2.init();
for(int i=1;i<=m;i++){
cin>>q[i].op;
q[i].x=read();
if(q[i].op=='U'||q[i].op=='M') q[i].y=read();
}
int lst=0;
for(int i=1;i<=m;i++){
if(q[i].op=='U'){
dsu1.merge(q[i].x,q[i].y);
}else if(q[i].op=='M'){
dsu2.merge(q[i].x,q[i].y);
}else if(q[i].op=='A'){
int x=dsu1.find(q[i].x);
val[x]+=dsu1.sz[x];
}else if(q[i].op=='Z'){
}else{
}
}
return 0;
}```