#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#define inf 1000000007
using namespace std;
int n,m,sum,h[505][505],q[250005][2];
bool v[505][505],vis[505][505];
int dx[4]={-1,0,0,1};
int dy[4]={0,1,-1,0};
struct node{int l,r;} c[505];
inline bool cmp(node a,node b)
{
return a.l==b.l?a.r<b.r:a.l<b.l;
}
inline int read()
{
int a=0,f=1; char c=getchar();
while (c<‘0‘||c>‘9‘) {if (c==‘-‘) f=-1; c=getchar();}
while (c>=‘0‘&&c<=‘9‘) {a=a*10+c-‘0‘; c=getchar();}
return a*f;
}
inline void bfs(int x,int y)
{
int t=0,w=1;
c[y].l=c[y].r=y;
q[1][0]=x; q[1][1]=y; v[x][y]=1; vis[x][y]=1;
while (t<w)
{
int nowx=q[++t][0],nowy=q[t][1];
for (int i=0;i<4;i++)
{
int xx=nowx+dx[i],yy=nowy+dy[i];
if (vis[xx][yy]||xx<1||xx>n||yy<1||yy>m||h[xx][yy]>=h[nowx][nowy]) continue;
v[xx][yy]=1; vis[xx][yy]=1;
if (xx==n) c[y].l=min(c[y].l,yy),c[y].r=max(c[y].r,yy);
q[++w][0]=xx; q[w][1]=yy;
}
}
}
int main()
{
n=read(); m=read();
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
h[i][j]=read();
memset(v,0,sizeof(v));
for (int i=1;i<=m;i++) c[i].l=inf;
for (int i=1;i<=m;i++)
{
memset(vis,0,sizeof(vis));
bfs(1,i);
}
for (int i=1;i<=m;i++) if (!v[n][i]) sum++;
if (sum!=0) {printf("0\n%d",sum); return 0;}
sort(c+1,c+m+1,cmp);
int now=0,list=0;
for (int i=1;i<=m;i++)
{
if (now+1>=c[i].l) list=max(list,c[i].r);
else now=list,list=max(list,c[i].r),sum++;
}
if (now!=m) sum++;
printf("1\n%d",sum);
return 0;
}