#include <algorithm>
#include<iostream>
#include <vector>
using namespace std;
int main()
{
int n;
int maxv=0;
while(cin>>n&&n)
{
vector<int> nums(n,0);//这个定义应该在输入n以后
for(int i=0;i<n;i++)
{
cin>>nums[i];
}
int st=0,ed=0;
int t_st=0,t_ed=0;//暂存开始和结束的坐标
vector<int> dp(n,*min_element(nums.begin(), nums.end()));//dp[i]代表以i结尾的序列的最大连续子序列之和
dp[0]=nums[0];
maxv=*min_element(nums.begin(), nums.end());//最大连续子序列之和,初始化为最小值
for(int i=1;i<n;i++)
{/*dp[0]一定是nums[0],所以从第二个开始遍历:
1.如果当前元素nums[i]加上之前的以i-1结尾的
最大连续子序列之和dp[i-1]比当前元素nums[i]
大----->那么,我们要寻找的最大连续子序列的
开始坐标不用变,但是结束坐标需要暂时改变*/
if(dp[i-1]+nums[i]>=nums[i])
{
t_ed=i;//结束坐标需要暂时改变
dp[i]=dp[i-1]+nums[i];
if(dp[i-1]+nums[i]>maxv)
{//如果这次的连续子序列之和比之前统计的大,那么开始和结束的坐标需要改变
maxv=dp[i-1]+nums[i];
ed=t_ed;
st=t_st;
}
}
else
{
dp[i]=nums[i];
t_st=t_ed=i;
if(nums[i]>maxv)
{
maxv=nums[i];
st=t_st;
ed=t_ed;
}
}
}
/*若所有K个元素都是负数,则定义其最大和为0,输出整个序列的首尾元素:
maxv<0和全是负数的情况是互为充要条件,因为max<0,说明任何单独的
元素都是小于0的,只要有一个不小于0,maxv都不可能小于0*/
if(maxv<0)
{
cout<<"0"<<" "<<nums[0]<<" "<<nums[nums.size()-1]<<endl;
}
else
{
cout<<maxv<<" "<<nums[st]<<" "<<nums[ed]<<endl;
}
}
}