/*
TASK:apple
LANG:C
*/
#include <stdio.h>
#define MAX(ta, tb) (((ta)>(tb))?(ta):(tb))

	long a[70][70], b[70][70];
  long N, M, ans;

int main () {
  long i, j, max, ind;
  scanf("%ld%ld", &N, &M);
  for(i=0; i<N; i+=1) {
  	for(j=0; j<M; j+=1) {
    	scanf("%ld", &a[i][j]);
      b[i][j]=a[i][j];
    }
  }

  for(j=1; j<M; j+=1) {
  	a[0][j]+=a[0][j-1];
  }
  for(i=1; i<N; i+=1) {
    a[i][0]+=a[i-1][0];
  	for(j=1; j<M; j+=1) {
			a[i][j]+=MAX(a[i][j-1], a[i-1][j]);
    }
  }
  max=a[N-1][0]; ind=0;
  for(i=N-1, j=1; j<M; j+=1) {
  	if(max<a[i][j]) {
    	max=a[i][j];
      ind=j;
    }
  }
  ans=max;
//  printf("(%ld) ", ans);

  i=N-1; j=ind;
  do{
    b[i][j]=0;
		if(i==0 && j!=0) {j-=1;}
    else if(j==0 && i!=0) {i-=1;}
    else if(i!=0 && j!=0) {
    	if(a[i][j-1] > a[i-1][j]) {j-=1;}
      else {i-=1;}
    }
    else {break;}
  }while(1);

  for(j=1; j<M; j+=1) {
  	b[0][j]+=b[0][j-1];
  }
  for(i=1; i<N; i+=1) {
    b[i][0]+=b[i-1][0];
  	for(j=1; j<M; j+=1) {
			b[i][j]+=MAX(b[i][j-1], b[i-1][j]);
    }
  }
  max=b[N-1][0]; ind=0;
  for(i=N-1, j=1; j<M; j+=1) {
  	if(max<b[i][j]) {
    	max=b[i][j];
      ind=j;
    }
  }
  ans+=max;
  printf("%ld\n", ans);

	return 0;
}
