7-3

#include<bits/stdc++.h>
using namespace std;

const int N=1e4+10,M=1e2+10;
int a[N][M];
int output[N][M+1];

int counter=0;
int st[N];

int k,m;

struct sort_output1{//排序专用 
	int num;
	int data;	
}sort_output[N];


bool compare(int i,int j,int m){
	for(int x=0;x<m;x++){
		if(a[i][x]!=a[j][x])
			return false;
	}
	return true;
}

void copyarray(int x,int m){
	for(int i=0;i<m;i++){
		output[counter][i+1]=a[x][i];
	}
}

bool cmp(sort_output1 a,sort_output1 b){
	if(a.data==b.data){
		for(int i=1;i<=k;i++){
			return output[a.num][i]<output[b.num][i];
		} 	
	}
	else{
		return a.data>b.data;
	}
}

int main(){

	cin>>k>>m;
	for(int i=0;i<k;i++){
		for(int j=0;j<m;j++){
			cin>>a[i][j];
		}
	}

	
	
	for(int i=0;i<k;i++){
		int flag=0;//没有相同的数组 
		for(int j=i;j<k;j++){
			if(a[i][0]==a[j][0]&&!st[j]){
				//数组比较 
				if(compare(i,j,m)){//相同 
					output[counter][0]=output[counter][0]+1;
					copyarray(i,m);
					flag=1;
					st[j]=true;
				}
			}
		}
		if(flag==1){//有相同数组,output就进一位。 
			counter++;
		}	
	}
		
	//排序 
	for(int i=0;i<counter;i++){
		sort_output[i].num=i;
		sort_output[i].data=output[i][0];
	}
	
	sort(sort_output,sort_output+counter,cmp);


	
	//输出
	cout<<counter<<endl;
	for(int i=0;i<counter;i++){
		for(int j=0;j<=m;j++){
			if(j==m){			
				cout<<output[sort_output[i].num][j];			
			}
			else{
				cout<<output[sort_output[i].num][j]<<" ";				
			}

		}
		cout<<endl;
	}	
	
	return 0;
}