#include<stdio.h>
int M,N,ranges[501][2],hash[501],map[501][501],dp[501][501],tianc[501],sort[501],N_line[501],count,cur;
void
dfs(int x,int y){
if(x==N){
if(!N_line[y]){
count++;
N_line[y]=1;
}
ranges[cur][0]=ranges[cur][0]<y?ranges[cur][0]:y;
ranges[cur][1]=ranges[cur][1]>y?ranges[cur][1]:y;
}
dp[x][y]=cur;
if(x>1 && dp[x-1][y]!=cur && map[x-1][y]<map[x][y])
dfs(x-1,y);
if(x<N && dp[x+1][y]!=cur && map[x+1][y]<map[x][y])
dfs(x+1,y);
if(y>1 && dp[x][y-1]!=cur && map[x][y-1]<map[x][y])
dfs(x,y-1);
if(y<M && dp[x][y+1]!=cur && map[x][y+1]<map[x][y])
dfs(x,y+1);
}
int
main(){
int i,j,r=1;
scanf("%d%d",&N,&M);
i=1;
while(i<=N){
j=1;
while(j<=M){
scanf("%d ",map[i]+j);
j++;
}
i++;
}
for(i=1;i<=M;i++){
if(map[1][i]<map[1][i-1])
continue;
cur=i;
ranges[i][0]=501;
dfs(1,i);
}
if(count!=M){
printf("0\n%d",M-count);
return 0;
}
for(i=1;i<=M;i++){
j=ranges[i][0];
if(!sort[j] || ranges[i][1]>ranges[sort[j]][1])
sort[j]=i;
}
for(i=1;i<=M;i++){
if(!sort[i])
continue;
if(ranges[sort[i]][1]>r){
for(j=r;j<=ranges[sort[i]][1];j++)
tianc[j]=sort[i];
r=ranges[sort[i]][1];
}
}
for(i=1,count=0;i<=M;i++){
if(!hash[tianc[i]])
count++,hash[tianc[i]]=1;
}
printf("1\n%d",count);
return 0;
}