#include <stdio.h>
#include <string.h>
int board[1005][1005], n, m, hold[1005][1005], flag = 0, fx[5] = {1, -1, 0, 0},
fy[5] = {0, 0, 1, -1};
void dfs(int i, int j, int max) {
if (i == n) {
flag = 1;
return;
}
for (int k = 0; k < 4; k++) {
int x = i + fx[k], y = j + fy[k];
if (x >= 1 && x <= n && y >= 1 && y <= m && board[x][y] <= max &&
hold[x][y] != 1 && flag != 1) {
hold[x][y] = 1;
dfs(x, y, max);
hold[x][y] = 0;
if (flag == 1) return ;
}
}
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
scanf("%d", &board[i][j]);
}
}
hold[1][1] = 1;
int left = 0, right = 1000;
while (left + 1 < right) {
flag = 0;
int mid = (left + right) / 2;
dfs(1, 1, mid);
memset(hold, 0, sizeof(hold));
hold[1][1] = 1;
if (flag == 1)
right = mid;
else
left = mid;
}
printf("%d", right);
return 0;
}