#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef structnode{
int a[40];
}hugeint;
hugeint f[81][81],k1,k2,a[81],max;
int n, m;
hugeint add(hugeint k,hugeint l)
{
hugeint j;
memset(j.a, 0, sizeof(j.a));
for(int i = 1; i <= k.a[0] || i<=l.a[0]; i++)
{
j.a[i] = k.a[i] + l.a[i];
}
j.a[0] = k.a[0] > l.a[0] ? k.a[0] : l.a[0];
for(int i = 1; i <= j.a[0]; i++)
{
j.a[i+1] += j.a[i]/10;
j.a[i] %= 10;
}
if(j.a[j.a[0]+1]>0)
j.a[0]++;
return j;
}
void init()
{
memset(a,0,sizeof(a));
for(int i=1;i<=m;i++)
{
scanf("%d",&a[i].a[1]);
a[i].a[0]=1;
while(a[i].a[a[i].a[0]]>=10)
{
a[i].a[a[i].a[0]+1]=a[i].a[a[i].a[0]]/10;
a[i].a[a[i].a[0]]%=10;
a[i].a[0]++;
}
}
}
hugeint cmp(hugeint k,hugeint l)
{
if(k.a[0]>l.a[0])
return k;
if(k.a[0]<l.a[0])
return l;
if(k.a[0]==l.a[0])
{
for(int i=k.a[0];i>=1;i--)
{
if(k.a[i]>l.a[i])
{
return k;
}
if(k.a[i]<l.a[i])
{
return l;
}
}
}
return l;
}
void solve()
{
memset(f,0,sizeof(f));
for(int i=1;i<=m;i++)
{
f[i][i]=add(a[i],a[i]);
}
for(int i = m; i >= 1; i--)
{
for(int j = i+1; j<=m; j++)
{
k1 = add(f[i+1][j],a[i]);
k2 = add(f[i][j-1],a[j]);
f[i][j] = cmp(k1,k2);
f[i][j] = add(f[i][j],f[i][j]);
}
}
max=add(max,f[1][m]);
}
void output()
{
for (int i = max.a[0]; i>=1; i--)
{
printf("%d",max.a[i]);
}
}
int main()
{
scanf("%d%d",&n,&m);
max.a[0]=1;
for(int i = 1; i <= n; i++)
{
init();
solve();
}
output();
return 0;
}