#7~#10全部WA
#include <bits/stdc++.h>
using namespace std;
struct node{
int vis=0;
int from=0;
vector<pair<int,int> > to;
};
vector<node> g[100010]={};
int cnt[100010]={},u=0,rnd=1;
bool isu[100010]={};
bool dfs(int x,int y,int b){
b^=g[x][y].from;
//cout<<rnd<<' '<<x<<' '<<y<<' '<<b<<"\n";
if (x==u && y==0 && g[x][y].vis) return b;
bool ret=0;
for (auto p:g[x][y].to){
int i=p.first,j=p.second;
if (g[i][j].vis==0){
g[i][j].vis=rnd;
if (dfs(i,j,b)==1) ret=1;
}
}
return ret;
}
void solve(){
int n,m;cin>>n>>m;
node k;k.to=vector<pair<int,int> >(0);
for (int i=1;i<=n+3;i++){
g[i]=vector<node>(0);cnt[i]=0;g[i].push_back(k);
isu[i]=0;
}
isu[0]=0;
u=0;
for (int i=1;i<=m;i++){
char c;cin>>c;
if (c=='T'){
int p;cin>>p;
g[n+1][0].to.push_back({p,++cnt[p]});
g[p].push_back(k);
}
else if (c=='F'){
int p;cin>>p;
g[n+2][0].to.push_back({p,++cnt[p]});
g[p].push_back(k);
}
else if (c=='U'){
int p;cin>>p;
g[n+3][0].to.push_back({p,++cnt[p]});
g[p].push_back(k);
}
else{
int a,b;cin>>a>>b;
g[b][cnt[b]].to.push_back({a,cnt[a]+1});
cnt[a]++;
g[a].push_back(k);
if (c=='-') g[a][cnt[a]].from=1;
}
}
for (int i=1;i<=n;i++) g[i][cnt[i]].to.push_back({i,0});
isu[3]=1;
rnd=1;
u=0;
dfs(n+1,0,0);
rnd++;
dfs(n+2,0,0);
rnd++;
dfs(n+3,0,0);
for (int i=1;i<=n;i++){
if (!g[i][0].vis){
rnd++;u=i;
isu[rnd]=dfs(i,0,0);
}
}
int ans=0;
for (int i=1;i<=n;i++){
ans+=isu[g[i][0].vis];
}
cout<<ans<<"\n";
}
int main(){
ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int c,t;cin>>c>>t;
while (t--) solve();
}