#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;
        }
    }
}