#include <cstdio>
#include <cstring>
#include <iostream>
#include <utility>
#include <vector>
using namespace std;
int n;
int m;
int nums[514][514];
int vis[514][514];
int xc[4] = {1, -1, 0, 0};
int yc[4] = {0, 0, 1, -1};
pair<int, int> lines[514];
void dfs (int start, int x, int y) {
if (vis[x][y] == start) {
return;
}
vis[x][y] = start;
if (x == n) {
if (lines[start].first == 0 || lines[start].first > y) {
lines[start].first = y;
}
if (lines[start].second == 0 || lines[start].second < y) {
lines[start].second = y;
}
}
for (int i = 0; i < 4; i++) {
int xx = x + xc[i];
int yy = y + yc[i];
if (nums[xx][yy] < nums[x][y]) {
dfs (start, xx, yy);
}
}
}
int main () {
freopen ("flow.in", "r", stdin);
freopen ("flow.out", "w", stdout);
cin >> n >> m;
memset (nums, 0x3f, sizeof (nums));
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> nums[i][j];
}
}
for (int i = 1; i <= m; i++) {
dfs (i, 1, i);
}
int cc = 0;
for (int i = 1; i <= m; i++) {
cc += !vis[n][i];
}
if (cc) {
cout << 0 << endl;
cout << cc << endl;
return 0;
}
cc = 0;
int l = 1;
int r;
while (l <= m) {
r = 0;
for (int i = 1; i <= m; i++) {
if (lines[i].first <= l && lines[i].second > r) {
r = lines[i].second;
}
}
l = r + 1;
cc++;
}
cout << 1 << endl;
cout << cc << endl;
return 0;
}