#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
int n, m;
int a[1005][1005];
bool used[1005][1005];
int dx[5] = { 0,1,-1,0,0 };
int dy[5] = { 0,0,0,1,-1 };
int r=0, l=0;
int mid, ans, xx, yy;
bool bfs(int x, int y, int mid)
{
queue<pair<int, int>>q;
q.push(make_pair(x,y)); used[x][y] = true;
while (!q.empty())
{
q.pop(); xx = q.front().first; yy = q.front().second;
for (int i = 0; i < 5; i++)
{
int nx = xx + dx[i];
int ny = yy + dy[i];
if (nx < 0 || nx > n-1 || yy < 0 || yy > m-1 || used[nx][ny] || a[nx][ny] > mid)
continue;
used[nx][ny] = true;
if (nx == n-1) return true;
else q.push(make_pair(nx, ny));
}
}
return false;
}
int main()
{
cin >> n >> m;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
{
cin >> a[i][j];
l = min(l, a[i][j]);
r = max(r, a[i][j]);
}
while (l <= r)
{
mid = (l + r) >> 1;
memset(used, false, sizeof(used));
if (bfs(0, 0, mid)) r = mid - 1, ans = r;
else l = mid + 1;
}
cout << ans;
}