#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
int n,m,a[505][505],vis[505][505],ai[505],cnt1,cnt2;
int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
bool cmp(int x,int y) {
return a[1][x]>a[1][y];
}
bool judge() {
for(int i=1;i<=m;i++)
if(!vis[n][i])
return false;
return true;
}
int main() {
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
for(int i=1;i<=m;i++)
ai[i]=i;
sort(ai+1,ai+1+m,cmp);
for(int i=1;i<=m;i++) {
queue<int> q;
if(vis[1][ai[i]])
continue;
q.push(1),q.push(ai[i]);
if(judge())
break;
cnt1++;
vis[1][ai[i]]=true;
while(!q.empty()) {
int nox=q.front();q.pop();
int noy=q.front();q.pop();
for(int j=0;j<4;j++) {
int nexx=nox+dx[j];
int nexy=noy+dy[j];
if(nexx<1||nexx>n||nexy<1||nexy>m)
continue;
if(a[nexx][nexy]>=a[nox][noy]||vis[nexx][nexy])
continue;
q.push(nexx),q.push(nexy);
vis[nexx][nexy]=true;
if(judge())
break;
}
}
}
for(int i=1;i<=m;i++)
if(!vis[n][i])
cnt2++;
if(cnt2)
printf("0\n%d",cnt2);
else
printf("1\n%d",cnt1);
}