#include<bits/stdc++.h>
using namespace std;
int la[4]={0,1,0,-1};
int lb[4]={1,0,-1,0};
int n,m,a[1100][1100],l=1e9,r=0;
bool c[1010][1010];
bool pd(int x,int y){
return x>=1&&x<=n&&y>=1&&y<=m&&!c[x][y];
}
struct re{
int x,y;
};
queue<re> q;
bool check(int s){
while(!q.empty()){
re x=q.front(); q.pop();
for(int i=0;i<4;i++){
if(pd(x.x+la[i],x.y+lb[i])&&a[x.x+la[i]][x.y+lb[i]]<=s){
q.push((re){x.x+la[i],x.y+lb[i]});
c[x.x+la[i]][x.y+lb[i]]=1;
if(x.x+la[i]==n) return 1;
}
}
}
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];
l=min(a[i][j],l);
r=max(a[i][j],r);
}
}
while(l<r){
q.push((re){1,1});
memset(c,false,sizeof(c));
int mid=(l+r)/2;
if(check(mid)) r=mid;
else l=mid+1;
}
cout<<l;
return 0;
}