#include<cstdio>
#include<cstring>
#include<cstdlib>
char ans[30],anss[30],sum[30],a[88][10],data[88][88][30];int aa,n,m;
bool ff[88][88];
void plus(char j1[],char j2[]){
int max=0,x1,x2,jw=0,tmp=0;
int l1=strlen(j1);
int l2=strlen(j2);
if(l1>l2) max=l1; else max=l2;
for (int i=1;i<=max;++i){
if (l1-i>=0) x1=j1[l1-i]-48; else x1=0;
if (l2-i>=0) x2=j2[l2-i]-48; else x2=0;
tmp=(x1+x2+jw)%10;
if(x1+x2+jw>=10) jw=1;else jw=0;
ans[max-i]=tmp+48;
}
if (jw!=0) {
for (int i=max;i>=1;--i) ans[i]=ans[i-1];
ans[0]=49;
ans[max+1]='\0';
//printf("%s",ans);
return;
}
ans[max]='\0';
//printf("%s",ans);
}
void maxx(char j1[],char j2[]){
int l1=strlen(j1);
int l2=strlen(j2);
if (l1>l2) {
strcpy(anss,j1);
//for (int i=0;i<l1;++i) anss[i]=j1[i];
return;
}
if (l1<l2) {
strcpy(anss,j2);
//for (int i=0;i<l2;++i) anss[i]=j2[i];
return;
}
for (int i=0;i<l1;++i){
if (j1[i]>j2[i]){
strcpy(anss,j1);
//for (int i=0;i<l1;++i) anss[i]=j1[i];
return;
}
if (j1[i]<j2[i]){
strcpy(anss,j2);
//for (int i=0;i<l2;++i) anss[i]=j2[i];
return;
}
}
strcpy(anss,j2);
}
void f(int i,int j){
if (i==j){
plus(a[i],a[i]);
strcpy(data[i][j],ans);
//plus(data[i][j],ans);
ff[i][j]=true;
return;
}
char tmp[30]="",tmp1[30]="";
if (ff[i+1][j]==false) f(i+1,j);
//f(i+1,j);
plus(data[i+1][j],a[i]);
strcpy(tmp,ans);
plus(tmp,tmp);
//int l=strlen(ans);
strcpy(tmp1,ans);
//for (int i=1;i<l;++i) tmp[i]=ans[i];
if (ff[i][j-1]==false) f(i,j-1);
//f(i,j-1);
plus(data[i][j-1],a[j]);
strcpy(tmp,ans);
plus(tmp,tmp);
maxx(ans,tmp1);
strcpy(data[i][j],anss);
ff[i][j]=true;
}
int main(){
freopen("game.in","r",stdin);
freopen("game.out","w",stdout);
scanf("%d%d",&n,&m);
for (int i=1;i<=n;++i){
for (int j=1;j<=m;++j) {
scanf("%d",&aa);
sprintf(a[j], "%d", aa);
//itoa(aa,a[j],10);
//printf("%s ",a[j]);
}
memset(ff,false,sizeof(ff));
f(1,m);
plus(sum,data[1][m]);
strcpy(sum,ans);
}
printf("%s",sum);
return 0;
}