/*
LANG:C++
TASK:apple
*/
#include <stdio.h>
#include <string.h>
#define max(a,b) (a > b ? a : b)
#define maxn 75
#define FOR(i,n) for(int i=0;i<n;i++)

int dp[75][75][75][75];

int dx[3] = { 0,1 };
int dy[3] = { 1,0 };
int A[maxn][maxn];
int n,m;

void init() {
     scanf("%d %d",&n,&m);
     FOR(i,n) FOR(j,m) scanf("%d",&A[i][j]);
}

int solve1(int x,int y,int x1,int y1) {
     if(dp[x][y][x1][y1] != -1) return dp[x][y][x1][y1];
     int cres = 0;
     FOR(i,2) {
              int nx(x+dx[i]),ny(y+dy[i]);
              if(nx<n && ny<m) {
                 if(!(nx == x1 && ny==y1)) {
                         int nres = A[nx][ny] + solve1(nx,ny,x1,y1);
                         if(nres > cres) cres = nres;
                 }
              }
     }
     return dp[x][y][x1][y1] = cres;
}

int solve2(int x,int y,int x1,int y1) {
     if(dp[x][y][x1][y1] != -1) return dp[x][y][x1][y1];
     int cres = 0;
     FOR(i,2) {
              int nx(x1+dx[i]),ny(y1+dy[i]);
              if(nx<n && ny<m) {
                 if(!(nx == x && ny==y)) {
                         int nres = A[nx][ny] + solve1(x,y,nx,ny);
                         if(nres > cres) cres = nres;
                 }
              }
     }
     return dp[x][y][x1][y1] = cres;
}

int go(int x,int y,int x1,int y1) {
    if(dp[x][y][x1][y1] != -1) return dp[x][y][x1][y1];
    int res(0);
    
    if(x==n-1 && y==m-1) {
              return dp[x][y][x1][y1] = solve2(x,y,x1,y1);
    }
    if(x1==n-1 && y1==m-1) {
               return dp[x][y][x1][y1] = solve1(x,y,x1,y1);
    }
    
    FOR(i,2) {
       FOR(j,2) {
                
          int nx(x+dx[i]),ny(y+dy[i]),nx1(x1+dx[j]),ny1(y1+dy[j]);
          if(nx<n && ny < m && nx1<n && ny1<m) {
                  
                  if( (nx==nx1) && (ny==ny1) && !(nx==n-1 && ny==m-1) ) continue;
                                    
                  if(ny <= ny1) {
                        int next = go(nx,ny,nx1,ny1);
                        if( (nx==nx1 && ny==ny1) ) next += A[nx][ny];
                        else next += A[nx][ny] + A[nx1][ny1];
                        res = max(res, next);
                  }
          }
       }
    }
    return dp[x][y][x1][y1] = res;
}

int main() {
    init();
    FOR(i,n) FOR(j,m) FOR(k,n) FOR(f,m) dp[i][j][k][f] = -1;
    dp[n-1][m-1][n-1][m-1] = 0;
    printf("%d\n",go(0,0,0,0) + A[0][0]);
    return 0;
}
