#include<iostream>
#include <vector>
#include<stdio.h>
#include<string>
#include<string.h>
#include <list>
#include <algorithm>
using namespace std;
class disjoint
{
private :
vector<int> parent ;
public :
disjoint(int n):parent(n+10)
{
for (int i=1 ; i<=n ;i++)
parent[i]=i;
}
int Find (int x)
{
if (parent[x]==x)
return x;
else
{
parent[x]=Find(parent[x]);
return parent[x];
}
}
void Union (int x ,int y)
{
int a=Find(x);
int b=Find(y);
if(x==y)
return ;
else
parent[b]=a;
}
~disjoint()
{
parent.clear();
}
};
int main()
{ int tc;
cin>>tc;
int n,cm1,cm2;
int yescount =0;
int nocount=0;
char c;
bool first=true;
while(tc--)
{
yescount =0;
nocount=0;
cin>>n;
disjoint computers(n);
getchar ();
while((c = getchar ()) && isalpha (c) )
{
if(c=='c')
{
cin>>cm1>>cm2;
getchar ();
computers.Union(cm1,cm2);
}
else if(c=='q')
{
cin>>cm1>>cm2;
getchar ();
if(computers.Find(cm1)!=computers.Find(cm2))
nocount++;
else
yescount++;
}
}
if (first)
{
cout<<yescount<<','<<nocount;
first=false;
}
else
{
cout<<endl<<yescount<<','<<nocount;
}
}
return 0;
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlPHN0ZGlvLmg+CiNpbmNsdWRlPHN0cmluZz4gCiNpbmNsdWRlPHN0cmluZy5oPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPGFsZ29yaXRobT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIGRpc2pvaW50IAp7CnByaXZhdGUgOgoJdmVjdG9yPGludD4gcGFyZW50IDsKcHVibGljIDoKCWRpc2pvaW50KGludCBuKTpwYXJlbnQobisxMCkKCQl7CgkJCWZvciAoaW50IGk9MSA7IGk8PW4gO2krKykKCQkJCXBhcmVudFtpXT1pOwoJCX0KICAgIGludCBGaW5kIChpbnQgeCkKCQl7CiAgICAgICAgICBpZiAocGFyZW50W3hdPT14KQoJCQkgIHJldHVybiB4OwoJCSAgZWxzZSAKCQkgIHsKCQkJICBwYXJlbnRbeF09RmluZChwYXJlbnRbeF0pOwoJCQkgIHJldHVybiBwYXJlbnRbeF07CgkJICB9CgkJfQoJdm9pZCBVbmlvbiAoaW50IHggLGludCB5KQoJewoJCWludCBhPUZpbmQoeCk7CgkJaW50IGI9RmluZCh5KTsKCQlpZih4PT15KQoJCQlyZXR1cm4gOwoJCWVsc2UgCgkJCXBhcmVudFtiXT1hOwoJfQoKfmRpc2pvaW50KCkKCXsKCQlwYXJlbnQuY2xlYXIoKTsKCX0KCn07CgppbnQgbWFpbigpCnsgaW50IHRjOwogIGNpbj4+dGM7CiAgaW50IG4sY20xLGNtMjsKCWludCB5ZXNjb3VudCA9MDsKCWludCBub2NvdW50PTA7CgljaGFyIGM7Cglib29sIGZpcnN0PXRydWU7CgkKICB3aGlsZSh0Yy0tKQogIHsKCXllc2NvdW50ID0wOwoJbm9jb3VudD0wOwoJY2luPj5uOwoJZGlzam9pbnQgY29tcHV0ZXJzKG4pOwogICAgZ2V0Y2hhciAoKTsKCXdoaWxlKChjID0gZ2V0Y2hhciAoKSkgJiYgaXNhbHBoYSAoYykgKQoJCXsKICAgICAgICAKCQkgaWYoYz09J2MnKQoJCSB7CgkJCSAgY2luPj5jbTE+PmNtMjsKCQkJICBnZXRjaGFyICgpOwoJCQkgY29tcHV0ZXJzLlVuaW9uKGNtMSxjbTIpOwoJCQkgCgkJIH0KCQkgZWxzZSBpZihjPT0ncScpIAoJCQkgewoJCQkJICBjaW4+PmNtMT4+Y20yOwoJCQkJICBnZXRjaGFyICgpOwoJCQkJIGlmKGNvbXB1dGVycy5GaW5kKGNtMSkhPWNvbXB1dGVycy5GaW5kKGNtMikpCgkJCQkJIG5vY291bnQrKzsKCQkJCSBlbHNlIAoJCQkJCSB5ZXNjb3VudCsrOwoKCQkJIH0KCQkgCgkJfQoJaWYgKGZpcnN0KQoJewoJY291dDw8eWVzY291bnQ8PCcsJzw8bm9jb3VudDsKCWZpcnN0PWZhbHNlOwoJfQoJZWxzZQoJewoKICAgIGNvdXQ8PGVuZGw8PHllc2NvdW50PDwnLCc8PG5vY291bnQ7Cgl9CgkKICB9CglyZXR1cm4gMDsKfQ==