#include<iostream>
using namespace std;
const int N = 1000005;
int p[N],pre_max[N];
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int i,j,k,m,n,curMax,Max;
while(scanf("%d%d",&m,&n)!=EOF)
{
memset(pre_max,0,sizeof(pre_max));
for(i=1; i<=n; i++)
scanf("%d",&p[i]);
for(i=1; i<=m; i++)
{
curMax = 0;
for(j=1; j<=i; j++)
curMax += p[j];
Max = curMax;
for(j=i+1; j<=n; j++)
{
//此时的pre_max[j-1]表示:前j-1项中含i-1个子段的最大和,且最后一个子段的最后一项是p[j-1];
curMax = max(curMax,pre_max[j-1]) + p[j];
//更新后的pre_max[j-1]表示:前j-1项中含i个子段的最大和,且最后一个子段的最后一项是p[j-1];
pre_max[j-1] = Max;
Max = max(curMax,Max);
}
}
printf("%d\n",Max);
}
return 0;
}