/*
TASK:apple
LANG:C++
*/

#include <cstdio>
//#include <conio.h>
#include <algorithm>
using namespace std;

#define MN      75

int A[MN][MN];
int B[MN][MN];
int N,M;

int findPath()
{
    B[0][0]=A[0][0];
    for (int i=1;i<N;++i) B[i][0]=B[i-1][0]+A[i][0];
    for (int j=1;j<M;++j) B[0][j]=B[0][j-1]+A[0][j];
    for (int i=1;i<N;++i) {
        for (int j=1;j<M;++j)
            B[i][j]=A[i][j] + max(B[i-1][j],B[i][j-1]);
    }
    
    int x=N-1,y=M-1;
    int val=B[x][y];

    for (int j=0;j<M;++j) {
        if (val<B[N-1][j]) {
            val=B[N-1][j];
            x=N-1; y=j;
        }
    }

    for (int i=N-1;i>=0;--i) {
        if (val<B[i][M-1]) {
            val=B[i][M-1];
            x=i; y=M-1;
        }
    }
    
    // clr path
    int i=x, j=y;
    for (;;) {
        A[i][j]=0;
        //printf("%d %d\n",i,j);
        if (i==0 && j==0) break;
        
        int v1=(j-1>=0) ? B[i][j-1] : -1;
        int v2=(i-1>=0) ? B[i-1][j] : -1;
        
        if (v1>=v2) j--;
        else --i;
    }
    
    return val;
}

int main()
{
    //freopen("a1.in","r",stdin);
    
    scanf("%d%d",&N,&M);
    for (int i=0;i<N;++i) {
        for (int j=0;j<M;++j)
            scanf("%d",&A[i][j]);
    }
    
    int ans=findPath();
    ans+=findPath();
    printf("%d\n",ans);
    
    
    //getch();
    return 0;
}
