#include <bits/stdc++.h>
using namespace std;
int n, m;
int a[510][510], cnt, l[510][510], r[510][510];
bool b[510][510], flg;
vector<pair<int, int>> v{{-1, 0}, {0, -1}, {1, 0}, {0, 1}};
inline void dfs(int x, int y) {
b[x][y] = true;
for (auto i : v) {
int nx = x + i.first, ny = y + i.second;
if (nx < 1 || ny < 1 || ny > m || nx > n)
continue;
if (a[nx][ny] >= a[x][y])
continue;
if (!b[nx][ny])
dfs(nx, ny);
l[x][y] = min(l[x][y], l[nx][ny]);
r[x][y] = max(r[x][y], r[nx][ny]);
}
}
int main() {
freopen("NtoS.in", "r", stdin);
freopen("NtoS.out", "w", stdout);
scanf("%d%d", &n, &m);
memset(l, 0x3f, sizeof(l));
memset(r, 0, sizeof(r));
for (int i = 1; i <= m; i++)
l[n][i] = r[n][i] = i;
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++)
if (!b[1][i])
dfs(1, i);
for (int i = 1; i <= m; i++)
if (!b[n][i])
flg = true, cnt++;
if (flg) {
printf("0\n%d", cnt);
return 0;
}
int lt = 1;
while (lt <= m) {
int maxr = 0;
for (int i = 1; i <= m; i++)
if (l[1][i] <= lt)
maxr = max(maxr, r[1][i]);
cnt++;
lt = maxr + 1;
}
printf("1\n");
printf("%d", cnt);
return 0;
}