rt,T2 40pts
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+100;
const int T=3e5+11, F=3e5+12, U=3e5+13;
int fa[maxn],w[maxn],lst[maxn],psz;
int Find(int u) {
if(fa[u]) {
int f=fa[u];
fa[u]=Find(fa[u]);
w[u]=w[u]*w[f];
return fa[u];
}else return u;
}
void Merge(int u,int v,int c) { // u:=v , u->v
int fu=Find(u),fv=Find(v);
if(fu==fv) {
if(w[u]*w[v]!=c&&!(w[u]==0&&w[v]==0)) {
// if(fu>1e5+10) cout<<'!';
w[fu]=0;
// cout<<'!';
}
return;
}
fa[fu]=fv;
w[fu]=w[u]*w[v]*c;
return;
// Find(fv);
}
inline int acc(int u) {
return lst[u]=++psz;
}
void init(int n) {
memset(fa,0,sizeof fa); //???
fill(w,w+15+n*3,1);
for(int i=1;i<=n;i++) lst[i]=i;
}
void work() {
int n,m;
cin>>n>>m;
init(n);
psz=n;
while(m--) {
char op;
int u,v;
cin>>op;
if(op=='T') {
cin>>u;
Merge(acc(u),T,1);
}
else if(op=='U') {
cin>>u;
Merge(acc(u),U,1);
}
else if(op=='F') {
cin>>u;
Merge(acc(u),F,1);
}
else if(op=='+') {
cin>>u>>v;
Merge(acc(u),lst[v],1);
}
else if(op=='-') {
cin>>u>>v;
Merge(acc(u),lst[v],-1);
}
else assert(false);
}
for(int i=1;i<=n;i++) { //n¸öÔ¼Êø£ºw[lst[i]]==w[i]
// if(w[lst[i]]==w[i]) continue;
// if(Find(i)==Find(lst[i])) {
// w[Find(i)]=0;
// }
Merge(i,lst[i],1);
}
int cnt=0;
for(int i=1;i<=n;i++) {
Find(i);
}
for(int i=1;i<=n;i++) if(w[i]==0) cnt++;
cout<<cnt<<'\n';
}
int main() {
//freopen("tribool.in","r",stdin);
// freopen("tribool.out","w",stdout);
int c,Tc;
cin>>c>>Tc;
w[U]=0,w[F]=-1,w[T]=1;
while(Tc--) {
work();
}
}