#include<iostream>
#include<cstring>
using namespace std;
int p,T;
int n,m,l,r;
int ans;
char ch;
int v,w;
struct dsu {
int fa[100010];
void init() {
for(int i=1; i<=n; i++)
fa[i]=i;
}
int find(int x) {
if(fa[x]==x) return x;
return find(fa[x]);
}
void merge(int x,int y) {
fa[find(x)]=find(y);
}
};
dsu a,b;
char col[100005];
int main()
{
cin.tie(0);
cout.tie(0);
cin>>p>>T;
while(T--) {
cin>>n>>m;
a.init();
b.init();
memset(col,'T',sizeof(col));
ans=0;
for(int i=1; i<=m; i++) {
cin>>ch;
if(isupper(ch)) {
cin>>m;
col[m]=ch;
} else {
cin>>l>>r;
if(ch=='+') {
a.merge(l,r);
if(a.find(l)==a.find(r)&&b.find(l)==b.find(r)) {
col[l]='U';
col[r]='U';
} else col[l]=col[r];
}
if(ch=='-') {
b.merge(l,r);
if(a.find(l)==a.find(r)&&b.find(l)==b.find(r)) {
if(v%2==1) {
a.merge(l,r);
col[l]=col[r];
b.fa[l]=l,b.fa[r]=r;
v++;
} else {
col[l]='U';
col[r]='U';
}
v++;
} else if(col[r]=='T') col[l]='F';
else if(col[r]=='F') col[l]='T';
else if(col[r]=='U') col[l]='U';
}
}
for(int i=1; i<=n; i++) {
if(col[i]=='U') ans++;
}
cout<<ans<<endl;
}
}
return 0;
}