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

#include <iostream>
using namespace std;

const int mn=78*78;
int rt[78][78];
int mat[mn][mn];
int N,M,res;

void readf(){
     cin>>M>>N;
     for(int j,i=1;i<=M;i++)
         for(j=1;j<=N;j++) cin>>rt[i][j];
     
}

int prev[mn],T[mn],D[mn],maxV=mn*1001;

void dijkstra(int A){
     int i,j,di,ee=M*N;
     for(i=1;i<=ee;i++)
        if(mat[A][i]){ prev[i]=A; D[i]=mat[A][i]; }
        else { prev[i]=-1; D[i]=maxV; }
     for(i=1;i<=ee;i++) T[i]=1;
     T[A]=0;
     while(1){
        j=-1; di=maxV;
        for(i=1;i<=ee;i++)
           if(T[i] && D[i]<di){ j=i; di=D[i]; }
        if(j==-1) break;
        T[j]=0;
        for(i=1;i<=ee;i++)
           if(T[i] && mat[j][i] && (D[i]>(D[j]+mat[j][i]))){
                   D[i]=D[j]+mat[j][i]; prev[i]=j;
           }
     }
}

int main()
{
 readf();
 int i,j,p;
 for(p=i=1;i<M;i++)
    for(j=1;j<N;j++)
       {
          p=(i-1)*N+j;
          mat[p][p+N]=mat[p][p+1]=-(rt[i][j]+1);
       }
 p=(M-1)*N;
 for(j=1;j<N;j++) mat[p+j][p+j+1]=-(rt[i][j]+1);
 for(i=1;i<M;i++) mat[(i-1)*N+M][i*N+M]=-(rt[M][j]+1);
 for(i=0;i<2;i++){
  dijkstra(1);
  for(j=N*M;prev[j]!=-1;j=prev[j]){ res+=mat[prev[j]][j]+1; mat[prev[j]][j]=-1; }
 }
 res=-(res-rt[M][N]);
 cout<<res<<endl;
 return 0;
}
