#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
int n,m;
queue<pair<int,int>> q;
bool book[1001][1001];
int a[1001][1001];
int Next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int max1=0;
bool check(int x)
{
memset(book,0,sizeof(book));
q.push(make_pair(1,1));
while(!q.empty())
{
int xx=q.front().first;
int yy=q.front().second;
q.pop();
if(book[xx][yy]==1) continue;
book[xx][yy]=1;
for(int k=0;k<=3;k++)
{
int tx=xx+Next[k][0];
int ty=yy+Next[k][1];
if(a[tx][ty]>x) continue;
if(tx<=0||ty<=0||tx>n||ty>m||book[tx][ty]||a[tx][ty]==-1) continue;
if(a[tx][ty]==0&&tx==n) return 1;
q.push(make_pair(tx,ty));
}
}
return 0;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
if(a[i][j]>max1)
max1=a[i][j];
}
}
int l=0,r=max1;
while(l<r)
{
int i=(l+r)>>1;
if(check(i)){
r=i;
}
else {
l=i+1;
}
}
cout<<l+1<<endl;
return 0;
}