#include <bits/stdc++.h>
using namespace std;
struct city{
int st,en;
}cities[510];
int n,m,s[510][510],L=1,ans=0;
int dh[5]={0,-1,0,1,0};
int dl[5]={0,0,1,0,-1};
bool f[510][510][510],p[510];
bool cmp(city a,city b){
return a.st<b.st;
}
void bfs(int r,int c,int j){
queue<int> qx,qy;
qx.push(r);
qy.push(c);
f[j][r][c]=true;
if(n==1){
p[c]=true;
}
while(!qx.empty()){
int x=qx.front(),y=qy.front();
qx.pop();
qy.pop();
for(int i=1;i<=4;i++){
int dx=x+dh[i],dy=y+dl[i];
if(dx>=1 && dx<=n && dy>=1 && dy<=m){
if(!f[j][dx][dy] && s[dx][dy]<s[x][y]){
f[j][dx][dy]=true;
qx.push(dx);
qy.push(dy);
if(dx==n){
p[dy]=true;
cities[j].st=(cities[j].st==0?dy:min(cities[j].st,dy));
cities[j].en=(cities[j].en==0?dy:max(cities[j].en,dy));
}
}
}
}
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>s[i][j];
}
}
for(int i=1;i<=m;i++){
bfs(1,i,i);
}
int city_num=0;
for(int i=1;i<=m;i++){
if(!p[i]){
city_num++;
}
}
if(city_num){
cout<<"0\n"<<city_num;
return 0;
}
cout<<"1\n";
sort(cities+1,cities+1+n,cmp);
while(L<=m){
int maxa=-1,maxn=-1e9;
for(int i=1;i<=m;i++){
if(cities[i].st<=L){
if(cities[i].en>maxn){
maxa=i;
maxn=cities[i].en;
}
}
}
L=cities[maxa].en+1;
ans++;
}
cout<<ans;
return 0;
}