#include<iostream>
using namespace std;
//每次跳跃在距离范围内(多的行+列<=3),比当前大更新数据
int b[105][105];//每个点的权值
int find_max(int x,int y){
int max=0;
for(int i=x;i>=x-3;i--){//从下往上倒推
for(int j=y;j>=x+y-i-3;j--){//从右往左倒推
if(!(x==i&&y==j)&&max<b[i][j]){
//同时满足三个条件
//1.不原地踏步2.每次跳跃在距离范围之内3.比当前max更大时才更新max
max=b[i][j];
}
}
}
return max;
}
int main(){
int n,m;
cin>>n>>m;
int i,j;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
cin>>b[i][j];
}
}
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
b[i][j]+=find_max(i,j);
}
}
cout<<b[n][m]+b[1][1];
}