#include <bits/stdc++.h>
using namespace std;
struct node1
{
int x,y;
}t,u;
struct node2
{
int s,e;
}a[600],last;
queue <node1> q;
int n,m,cnt,num;
int mapp[505][505];
bool book1[505][505],book2[505],f=1;
int d[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
void bfs(int x,int y,int s)
{
book1[x][y]=1;
t.x=x;
t.y=y;
q.push(t);
while(!q.empty())
{
t=q.front();
q.pop();
if(t.x==n)
{
book2[t.y]=1;
a[s].s=min(a[s].s,t.y);
a[s].e=max(a[s].e,t.y);
}
for(int i=0;i<4;i++)
{
int nx=t.x+d[i][0];
int ny=t.y+d[i][1];
if(nx<1 || nx>n || ny<1 || ny>m) continue;
if(mapp[nx][ny]<mapp[t.x][t.y] && book1[nx][ny]==0)
{
book1[nx][ny]=1;
u.x=nx;
u.y=ny;
q.push(u);
}
}
}
}
bool cmp(node2 a,node2 b)
{
return a.e>b.e;
}
int main()
{
cin >> n >> m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin >> mapp[i][j];
}
}
for(int i=1;i<=m;i++)
{
a[i].s=600;
a[i].e=0;
}
for(int i=1;i<=m;i++)
{
memset(book1,0,sizeof(book1));
bfs(1,i,i);
}
for(int i=1;i<=m;i++)
{
if(book2[i]==0) num++;
}
if(num>0)
{
cout<<0<<endl<<num;
return 0;
}
sort(a+1,a+n+1,cmp);
last.s=0;
last.e=0;
while(last.e<m)
{
for(int i=1;i<=m;i++)
{
if(a[i].s>=last.s+1 && a[i].s<=last.e+1)
{
cnt++;
last=a[i];
break;
}
}
}
cout<<1<<endl<<cnt;
return 0;
}