#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,h[505][504],l[505][505],r[504][505];
int dx[4]={0,1,-1,0};
int dy[4]={1,0,0,-1};
bool vis[505][505];
void dfs(int x,int y)
{
vis[x][y]=1;
//if(x==n) {
//l[x][y]=y,r[x][y]=y;
//return ;
//}
int xx,yy;
for(int i=0;i<4;i++)
{
xx=x+dx[i];
yy=y+dy[i];
if( (xx>n||xx<1||yy>m||yy<1)||h[xx][yy]>=h[x][y]||vis[xx][yy])
continue;
dfs(xx,yy);
l[x][y]=min(l[x][y],l[xx][yy]);
r[x][y]=max(r[x][y],r[xx][yy]);
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
cin>>h[i][j];
}
memset(l,0x3f,sizeof(l));
for(int i=1;i<=m;i++)
l[n][i]=r[n][i]=i;
for(int i=1;i<=m;i++)
if(vis[1][i]==0)
dfs(1,i);
int num=0;
for(int i=1;i<=m;i++)
if(!vis[n][i]) //有没遍历到的
num++;
if(num>0){
cout<<0<<endl<<num;
return 0;
}
int left=1,cnt=0;//,maxr=0;
//for(int i=1;i<=m;i++)
//cout<<r[1][i]<<" ";
while(left<=m) {
int maxr=0;
for(int i=1;i<=m;i++)
if(l[1][i]<=left) maxr=max(maxr,r[1][i]);
cnt++;
left=maxr+1;
//cout<<"left="<<left<<endl;
}
cout<<1<<endl<<cnt;
return 0;
}