/*
TASK:apple
LANG:C++
*/
#include<iostream>
#include<vector>
using namespace std; 
int sol[128][128];
int a[128][128];
int main()
{ int m;int n;
cin>>m>>n;int i,j;

vector <int> s;
vector <int> s1;
    for(i=0;i<m;i++)
     for(j=0;j<n;j++)
       cin>>a[i][j];

sol[0][0]=a[0][0];
for(i=1;i<m;i++)
 sol[i][0]=sol[i-1][0]+a[i][0];
for(i=1;i<n;i++)
 sol[0][i]=sol[0][i-1]+a[0][i];
for(i=1;i<m;i++)
 for(j=1;j<n;j++)
  { int east=sol[i][j-1] ;
    int south=sol[i-1][j];
    sol[i][j]=max(south,east)+a[i][j]; 
  }   
int max1=-9999;int maxi;int maxj;
for(i=0;i<m;i++)
 for(j=0;j<n;j++) 
  if(max1<sol[i][j]){ max1=sol[i][j];maxi=i;maxj=j;}
  //cout<<max1<<endl;
int tempi=maxi;int tempj=maxj;int tempmax=max1;
s.push_back(tempi);
s1.push_back(tempj);

while(1)
 { if(tempi==0&&tempj==0){break;}
    int west=sol[tempi][tempj-1];
    int north=sol[tempi-1][tempj];
    if(tempmax-a[tempi][tempj]==west){ s.push_back(tempi);s1.push_back(tempj-1);tempmax-=a[tempi][tempj];tempj--;continue;}
    else {s.push_back(tempi-1);s1.push_back(tempj);tempmax-=a[tempi][tempj];tempi--;}
 }
s.push_back(0);
s1.push_back(0);

for(i=0;i<s.size();i++)
 a[s[i]][s1[i]]=0;
for(i=0;i<m;i++)
 for(j=0;j<n;j++)
  sol[i][j]=0; 
for(i=1;i<m;i++)
 sol[i][0]=sol[i-1][0]+a[i][0];
for(i=1;i<n;i++)
 sol[0][i]=sol[0][i-1]+a[0][i];
for(i=1;i<m;i++)
 for(j=1;j<n;j++)
  { int east=sol[i][j-1] ;
    int south=sol[i-1][j];
    sol[i][j]=max(south,east)+a[i][j]; 
  }
int max2=-9999;
 for(i=0;i<m;i++)
  for(j=0;j<n;j++)
   if(sol[i][j]>max2)
    max2=sol[i][j];
cout<<max1+max2<<"\n";           
 // system("pause");
}
