#include<bits/stdc++.h>
using namespace std;
int n,z=INT_MIN,m;
vector<vector<int>> a,v,vv;
struct ss{vector<vector<int>> v; int x,y,k;};
void f(int vx,int vy)
{
queue<ss> q;
q.push({vv,vx,vy,a[vx][vy]});
while(q.size())
{
ss p=q.front(); q.pop();
vector<vector<int>> lvv=p.v;
int sx=p.x,sy=p.y,sk=p.k;
if(sk<=v[sx][sy]) continue;
v[sx][sy]=max(v[sx][sy],sk);
if(sx==n-1 && sy==m-1)
{
z=max(z,sk);
continue;
}
if(sx+1<n && !lvv[sx+1][sy])
{
lvv[sx+1][sy]=1;
q.push({lvv,sx+1,sy,sk+a[sx+1][sy]});
lvv[sx+1][sy]=0;
}
if(sy+1<m && !lvv[sx][sy+1])
{
lvv[sx][sy+1]=1;
q.push({lvv,sx,sy+1,sk+a[sx][sy+1]});
lvv[sx][sy+1]=0;
}
if(sy-1>=0 && !lvv[sx][sy-1])
{
lvv[sx][sy-1]=1;
q.push({lvv,sx,sy-1,sk+a[sx][sy-1]});
lvv[sx][sy-1]=0;
}
}
return ;
}
int main()
{
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin>>n>>m;
a.resize(n,vector<int>(m,0));
v.resize(n,vector<int>(m,INT_MIN));
vv.resize(n,vector<int>(m,0));
for(int x=0;x<n;x++)
for(int y=0;y<m;y++)
cin>>a[x][y];
f(0,0);
cout<<z;
return 0;
}