#include <bits/stdc++.h>
using namespace std;
struct Node
{
char type;
int to;
Node(string a)
{
type = a[0];
int temp=0;
for(int i=1;i<a.size()&&isdigit(a[i]);i++)
{
temp = temp*10;
temp += a[i]-'0';
}
to = temp;
}
};
int main()
{
//ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int T,n;
cin>>T>>n;
getchar();
string a;
vector<queue<Node>> data(n);
while(T--)
{
for(int i=0;i<n;i++)
{
while(!data[i].empty()) data[i].pop();
}
int maxOrder = 0; //记录指令数量
for(int j=0;j<n;j++)
{
getline(cin,a);
//cout<<'|'<<a<<'|'<<endl;
int start = 0;
for( int i=1;i<a.size();i++ )
{
if(a[i] == ' ')
{
Node node(a.substr(start,i-start));
data[j].push( node );
maxOrder++;
//cout<<maxOrder<<endl;
//cout<<a.substr(start,i-start)<<'|';
start = i+1; ;
}
}
Node node(a.substr(start));
data[j].push( node );
maxOrder++;
//cout<<maxOrder<<endl;
//cout<<a.substr(start,a.size())<<endl;
}
if( maxOrder%2 )
{
cout<<1<<endl;
continue;
}
int countt = 0;
int pos=0;
int flag = 1; //标志,若一轮循环无结果,则死锁,0表示无动作
int res=0; //结果
while(countt!=maxOrder && flag)
{
flag = 0;
for(pos =0;pos<n;pos++ )
{
//cout<<"pos:"<<pos<<endl;
if( data[pos].empty() ) //为空,跳过
{
continue;
}
Node node1 = data[pos].front();
//cout<<"temp:"<<temp[0]<<" tar:"<<tar<<endl;
if(node1.to>=n)
{
flag = 0;
break;
}
if(data[ node1.to ].empty() ) //目标为空
{
flag = 0;
break;
}
Node node2 = data[ node1.to ].front();
//cout<<temp<<"---"<<temp1<<endl;
//cout<<"temp1:"<<temp1[0]<<" tar1:"<<tar1<<endl;
if(node2.to>=n)
{
flag = 0;
break;
}
if(node2.to == pos && node1.type != node2.type ) //匹配成功
{
//cout<<pos<<' '<<tar<<"匹配成功"<<endl;
data[pos].pop();
data[node1.to].pop();
flag = 1;
countt += 2;
}
}
}
// cout<<"maxO:"<<maxOrder<<endl;
// cout<<"count:"<<countt<<endl;
if( countt == maxOrder )
{
cout<<0<<endl;
}
else cout<<1<<endl;
}
return 0;
}