#include<iostream>
using namespace std;
const int INF=0x7fffffff;
int f1[3001][3001],f2[3001][3001];
int a[3001][3001],b[3001][3001];
int maxn1[3001][3001][26];
int maxn2[3001][3001][26];
int n,m,ans=INF;
signed main(){
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
f1[i][j]=max(f1[i-1][j],f1[i][j-1])+a[i][j];
}
}
for(int i=n;i>0;i--){
for(int j=m;j>0;j--){
f2[i][j]=max(f2[i+1][j],f2[i][j+1])+a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
b[i][j]=f1[i][j]+f2[i][j]-a[i][j];
maxn1[i][j][0]=maxn2[j][i][0]=b[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=25;j++){
for(int k=1;k<=m;k++){
maxn1[i][k][j]=max(maxn1[i][k][j-1],maxn1[i][k+(1<<(j-1))][j-1]);
}
}
}
for(int i=1;i<=m;i++){
for(int j=1;j<=25;j++){
for(int k=1;k<=n;k++){
maxn2[i][k][j]=max(maxn2[i][k][j-1],maxn2[i][k+(1<<(j-1))][j-1]);
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int t1=b[i][j]-a[i][j],t2=0,t3=0;
for(int sb=25;sb>=0;sb--){
if((1<<sb)<=j){
t2=max(maxn1[i][1][sb],maxn1[i][j-(1<<sb)][sb]);
break;
}
}
for(int sb=25;sb>=0;sb--){
if((1<<sb)<=i){
t3=max(maxn2[j][1][sb],maxn2[j][i-(1<<sb)][sb]);
break;
}
}
ans=min(ans,max(t1,max(t2,t3)));
}
}
cout<<ans;
return 0;
}