/*
TASK:matrix
LANG:C++
*/

#include <iostream>
#include <algorithm>

using namespace std;

int n,m,i,j,p,num=0;
typedef struct
{
    int len,a[1005];
} arr;
arr a[1005];
int cmp(const void *a,const void *b)
{
	return *(int*)a-*(int*)b;
}
/*int cmparr(const void *a,const void *b)
{
    for(int i=0;i<m;i++)
	{
		if(*(int*)(a+i)<*(int*)(b+i))
			return -1;
	}
} */
int cmparr(const void *a,const void *b)
{
    for(int i=0;i<m;i++)
	{
	    if((*(arr*)a).a[i]<(*(arr*)b).a[i])
			return -1;
	    if((*(arr*)a).a[i]>(*(arr*)b).a[i])
			return 1;
	}
	return 0;
}
bool operator <(arr a,arr b)
{
    for(int i=0;i<1005;i++)
	    if(a.a[i]<=b.a[i])
			return true;
	return false;
}
bool operator !=(arr a,arr b)
{
    for(int i=0;i<m;i++)
		if(a.a[i]!=b.a[i])
			return true;
	return false;
}
int main()
{
	cin>>n>>m;
	for(i=0;i<n;i++)
		for(j=0;j<m;j++)
			cin>>a[i].a[j];
	for(i=0;i<n;i++)
	    qsort(a[i].a,m,sizeof(int*),cmp);
	//qsort(a,n,sizeof(int),cmparr);
//	sort(a,a+n);
	qsort(a,n,sizeof(arr),cmparr);
	for(i=0;i<n;i++)
		if(a[i]!=a[i+1])
			num++;
	/*for(i=0;i<n;i++)
	{
		for(j=0;j<m;j++)
			cout<<a[i].a[j]<<" ";
		cout<<"\n";
	} */
	cout<<num<<"\n";
    return 0;
}