#include <bits/stdc++.h>
using namespace std;
int n,m,l=9999,r=-1000,mid,ans;
int mp[1001][1001],dr[]{0,0,1,-1},dc[]{1,-1,0,0};
bool v[1001][1001];
bool bfs(int w){
queue<pair<int,int>>q;
q.push(make_pair(0,0));
while(!q.empty()){
int x=q.front().first,y=q.front().second;
v[x][y]=1;
q.pop();
for(int i=0;i<4;i++){
int a=x+dr[i],b=y+dc[i];
if(a<0||b<0||a>=n||b>=m||v[a][b]||mp[a][b]>w)continue;
if(a==n-1)
return true;
q.push(make_pair(a,b));
}
}
return false;
}
int main(){
cin.tie(0);
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>mp[i][j];
if(mp[i][j]<l&&i!=0&&i<n-1)l=mp[i][j];
if(mp[i][j]>r)r=mp[i][j];
}
}
while(l<=r){
int mid=(l+r)/2;
memset(v,0,sizeof(v));
if(bfs(mid))r=mid-1,ans=mid;
else l=mid+1;
}
cout<<ans;
return 0;
}