#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
	int C,N,D,r,c,count,a,b,ans=0;
	static char cost[1000][1000];
	int i,j,k;
	bool mae;
	cin>>C>>N;
	for (i=0;i<N;i++)
	{
		cin>>cost[i];
	}
	count=0;
	for (i=0;i<N/2;i++)
	{
		for (j=0;j<N/2;j++)
		{
			//左上のマスを対称かどうか調べる
			if (cost[i][j]==cost[N-i-1][j]&&
				cost[N-i-1][j]==cost[N-i-1][N-j-1]&&
				cost[N-i-1][N-j-1]==cost[i][N-j-1]&&
				cost[i][N-j-1]==cost[i][j])
			{
				//対称である
			} else {
				count++;
				//printf("最初%d\n",count);
			}
		}
	}
	if (!count) ans++;
	if (C==1)
	{
		if (count) puts("0");
		else puts("1");
		return 0;
	}
	for (k=1;k<C;k++)
	{
		cin>>D;
		for (i=0;i<D;i++)
		{
			cin>>r>>c;
			r--;c--;
			//もともと対称か調べる
			a=N-r-1;
			b=N-c-1;
			if (cost[a][b]==cost[N-a-1][b]&&
				cost[N-a-1][b]==cost[N-a-1][N-b-1]&&
				cost[N-a-1][N-b-1]==cost[a][N-b-1]&&
				cost[a][N-b-1]==cost[a][b])
			{
				mae=true;
			} else {
				mae=false;
			}
			//変わったマス
			if (cost[r][c]=='0')
			{
				cost[r][c]='1';
			} else {
				cost[r][c]='0';
			}
			if (r>=N/2) r=N-r-1;
			if (c>=N/2) c=N-c-1;
			if (cost[r][c]==cost[N-r-1][c]&&
				cost[N-r-1][c]==cost[N-r-1][N-c-1]&&
				cost[N-r-1][N-c-1]==cost[r][N-c-1]&&
				cost[r][N-c-1]==cost[r][c])
			{
				count--;
				//printf("座標は対称%dk=%d\n",count,k+1);
			} else {
				if (mae)
				{
					count++;
					//printf("座標は対称でない%dk=%d\n",count,k+1);
				}
			}
		}
		if (!count) ans++;
	}
	printf("%d\n",ans);
	return 0;
}

