#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
char op[N],x[N];
int a[N],b[N];
int head[N],tot,cnt;
bool in[N],vis[N],able[N];
struct Edge{
int next,to,val;
}e[N];
void adde(int u,int v,int w){
e[++tot].next=head[u];
e[tot].to=v;
e[tot].val=w;
head[u]=tot;
return;
}
void dfs1(int u,int now,int s){
for(int i=head[u];i;i=e[i].next){
int v=e[i].to,w=e[i].val;
if(v==s){
if((now+w)&1) able[s]=1;
continue;
}
if(vis[v]) continue;
vis[v]=1;
dfs1(v,now+w,s);
}
return;
}
void dfs2(int u,int s){
++cnt;
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(v==s) continue;
dfs2(v,s);
}
return;
}
int main(){
int c,t;cin>>c>>t;
while(t--){
memset(in,0,sizeof(in));
memset(head,0,sizeof(head));
memset(e,0,sizeof(e));
memset(vis,0,sizeof(vis));
memset(able,0,sizeof(able));
tot=cnt=0;
int n,m;cin>>n>>m;
for(int i=1;i<=n;i++){
x[i]=' ';
}
for(int i=1;i<=m;i++){
cin>>op[i]>>a[i];
if(op[i]=='+'||op[i]=='-') cin>>b[i];
}
for(int i=m;i>=1;i--){
if(in[a[i]]) continue;
if(op[i]=='T'||op[i]=='F'||op[i]=='U'){
if(!in[a[i]]) x[a[i]]=op[i];
in[a[i]]=1;
}
else{
if(a[i]==b[i]){
if(op[i]=='+') continue;
in[a[i]]=1;
++cnt;
continue;
}
if(!in[a[i]]){
if(op[i]=='+') adde(b[i],a[i],0);
else adde(b[i],a[i],1);
in[a[i]]=1;
}
}
}
for(int i=1;i<=n;i++){
if(!vis[i]){
vis[i]=1;
dfs1(i,0,i);
}
}
for(int i=1;i<=n;i++){
if(x[i]=='U'||able[i]) dfs2(i,i);
}
cout<<cnt<<endl;
}
return 0;
}