//要求输出最大连续字段和的第一个数和最大一个数,在DP[]中加一个数组记录开始元素就可以了
#include<iostream>
#include<cstdio>
using namespace std;
struct node
{
int head,v;
} dp[10010];
int arr[10010];
int head,rear;
int function(int k)
{
int ans=-20000;
dp[1].v=arr[1];
dp[1].head=arr[1];
for(int i=2; i<=k; i++)
{
if(dp[i-1].v>0)
{
dp[i].v=dp[i-1].v+arr[i];
dp[i].head=dp[i-1].head;//开始没加这个
}
else
{
dp[i].v=arr[i];
dp[i].head=arr[i];
}
}
for(int i=1; i<=k; i++)
{
if(dp[i].v>ans)
{
ans=dp[i].v;
head=dp[i].head;
rear=arr[i];
}
}
return ans;
}
int main()
{
int k;
while(scanf("%d",&k),k)
{
int sum=0;
for(int i=1; i<=k; i++)
{
scanf("%d",&arr[i]);
if(arr[i]<0)
sum++;
}
if(sum==k)
{
printf("0 %d %d\n",arr[1],arr[k]);
}
else
{
int ans=function(k);
printf("%d %d %d\n",ans,head,rear);
}
}
//system("puase");
return 0;
}