#include <string.h>
#include <algorithm>
using namespace std;
struct bigint{
unsigned int last;
unsigned int u[81];
bigint(){
last=0;
memset(u,0,sizeof(u));
}
bigint operator+(const bigint &a){
int l=max(last,a.last),i;
bigint m;
for(i=0;i<=l;i++){
m.u[i]+=u[i]+a.u[i];
m.u[i+1]+=m.u[i]/10;
m.u[i]%=10;
}
if(m.u[l+1]!=0)m.last=l+1;
else m.last=l;
return m;
}
bool operator>(const bigint &a){
if(last>a.last)return true;
if(last<a.last)return false;
int i;
for(i=last;i>=0;i--){
if(u[i]>a.u[i])return true;
if(u[i]<a.u[i])return false;
}
return false;
}
friend ostream& operator<<(ostream &os,bigint a){
int i;
for(i=a.last;i>=0;i--)
os<<a.u[i];
return os;
}
friend istream& operator>>(istream &is,bigint &a){
int i,l;char b[82];
is>>b;
memset(a.u,0,sizeof(a.u));//一定要memset 否则会悲剧
l=strlen(b)-1;
a.last=l;
for(i=0;i<=l;i++)
a.u[l-i]=b[i]-'0';
return is;
}
bool empty(){
if(last==0&&u[0]==0)return true;
else return false;
}
};
bigint a[81],f[81][81];
int n,m;
bigint ans;
bigint getans(int s,int t){
if(!f[s][t].empty())return f[s][t];
if(s==t)return f[s][s]=a[s]+a[s];
bigint t1,t2;
t1=getans(s+1,t)+a[s];
t2=getans(s,t-1)+a[t];
if(t1>t2)return f[s][t]=t1+t1;
else return f[s][t]=t2+t2;
}
int main(){
int i,j;
bigint temp;
cin>>n>>m;
for(i=1;i<=n;i++){
memset(f,0,sizeof(f));
for(j=1;j<=m;j++)
cin>>a[j];
temp=getans(1,m);
ans=ans+temp;
}
cout<<ans;
return 0;
}