#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;
}