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

struct path {
       int x,y,x1,y1;
} v[500];
int vsz(0);

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

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

void go(int x,int y,int x1,int y1) {
    int res(0);
    if(x==n-1 && y==m-1 && x1==n-1 && y1==m-1) {
              int B[75][75];
              FOR(i,n) FOR(j,m) B[i][j] = A[i][j];
              FOR(i,vsz) {
                         res += B[ v[i].x ][ v[i].y ];
                         B[v[i].x][v[i].y] = 0;
                         res += B[ v[i].x1 ][ v[i].y1 ];
                         B[v[i].x1][v[i].y1] = 0;
              }
              if(res > best) best = res;
              return;
    }
    int cres(0);
    int best(0);
    FOR(i,3) {
       FOR(j,3) {
                
          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 && !(i==2 && j==2)) {
                  path cur;
                  cur.x = nx; cur.y = ny; cur.x1 = nx1; cur.y1 = ny1;
                  v[vsz++] = cur;
                  go(nx,ny,nx1,ny1);
                  vsz--;
          }
       }
    }
}

int main() {
    init();
    go(0,0,0,0);
    printf("%d\n",best);
    scanf("%d",&n);
    return 0;
}
