#include<bits/stdc++.h>
#define int long long
using namespace std;
int r,c,map1[105][105],val[105][105];
int ans,result;
void search(int h){
int cnt1=0;
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
int cnt=0;
int atleast=0;//至少有一边符合条件
if(i-1!=0){//上
if(val[i-1][j]==h-1){
atleast++;
}
if(map1[i-1][j]>map1[i][j]||val[i-1][j]&&val[i-1][j]<h){
;
}
else{
continue;
}
}
if(j-1!=0){//左
if(val[i][j-1]==h-1){
atleast++;
}
if(map1[i][j-1]>map1[i][j]||val[i][j-1]&&val[i][j-1]<h){
;
}
else{
continue;
}
}
if(i!=r){//下
if(val[i+1][j]==h-1){
atleast++;
}
if(map1[i+1][j]>map1[i][j]||val[i+1][j]&&val[i+1][j]<h){
;
}
else{
continue;
}
}
if(j!=c){//右
if(val[i][j+1]==h-1){
atleast++;
}
if(map1[i][j+1]>map1[i][j]||val[i][j+1]&&val[i][j+1]<h){
;
}
else{
continue;
}
}
if(val[i][j]==0&&atleast!=0){
val[i][j]=h;
//cout<<h<<i<<j<<endl;//TEST--------------
cnt1++;
}
}
}
if(cnt1==0){
cout<<h-1;
exit(0);
}
search(h+1);
}
signed main(){
cin>>r>>c;
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
cin>>map1[i][j];
}
}
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
int cnt=0;
if(i-1==0||map1[i-1][j]>map1[i][j]){
cnt++;
}
if(j-1==0||map1[i][j-1]>map1[i][j]){
cnt++;
}
if(i==r||map1[i+1][j]>map1[i][j]){
cnt++;
}
if(j==c||map1[i][j+1]>map1[i][j]){
cnt++;
}
if(cnt==4){
val[i][j]=1;
}
}
}
search(2);
return 0;
}