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

#include <cstdio>
#include <cmath>
#include <ctime>
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

#define MUL 5
#define MAX 128
#define MM 33554432
#define INF 999666333
#define in cin
#define out cout

using namespace std;

//ifstream(in); ofstream(out);
int n, m; 
int ans, opt;
int o[MAX][MAX];
int a[MAX][MAX];
int dyn[MAX][MAX];
unsigned int sstime, curtime;


int recurse(int x, int y)
{
int i, c;
int cur, best;

best = 0;

if (dyn[x][y] != -1) return dyn[x][y];
if (x == n-1 && y == m-1) return a[x][y];

if (x < n-1)
   {
   cur = recurse(x+1, y) + a[x][y];
   if (cur > best) best = cur;
   }
if (y < m-1)
   {
   cur = recurse(x, y+1) + a[x][y];
   if (cur > best) best = cur;
   }

dyn[x][y] = best;

return best;
}


int goahead(int x, int y, int current)
{
int i;
int appl, cur, best;

if (current + o[x][y] + opt <= ans) return 0;

best = 0;
appl = a[x][y]; a[x][y] = 0;

if (x == n-1 && y == m-1) 
   {
   memset(dyn, -1, sizeof(dyn)); 
   if (current + appl + opt < ans) best = appl + opt;
   else best = appl + recurse(0, 0);
   if (current + best > ans) ans = current + best;
   
   curtime = clock();
 
   if ((double)(curtime - sstime) / (double)CLOCKS_PER_SEC > 0.4)
      {out << ans << endl; exit(0);}
   }
else
    {
    if (x < n-1) 
       {
       cur = appl + goahead(x+1, y, current+appl);
       if (cur > best) best = cur;
       }
    
    if (y < m-1) 
       {
       cur = appl + goahead(x, y+1, current+appl);
       if (cur > best) best = cur;
       }
    }

a[x][y] = appl;

return best;
}


int main(void)
{
int i, c;
sstime = clock();

//in.open("apple.in"); out.open("apple.out");

in >> n >> m;
for (i=0; i<n; i++) for (c=0; c<m; c++) in >> a[i][c];


ans = 0; opt = 0;
memset(dyn, -1, sizeof(dyn));
opt = recurse(0, 0);

for (i=0; i<n; i++)
    {
    for (c=0; c<m; c++)
        {
        memset(dyn, -1, sizeof(dyn));
        o[i][c] = recurse(i, c);
        }
    }

out << goahead(0, 0, 0) << endl;

return 0;
}
