#include <stdio.h>
#include <algorithm>
#include <limits>
int dp[10002];
using namespace std;
int main() {
    int k;
    while (scanf("%d", &k) != EOF) {
        if (k == 0) {
            break;
        }
        int data[k];
        bool isallnegative = true; //是否所有的数都为负数?
        for (int i = 0 ; i < k ; i++) {
            scanf("%d", &data[i]);
            if (data[i] >= 0) {
                isallnegative = false; //出现了正数
            }
        }
        if (isallnegative) { //所有输入的数均为负数
            printf("0 %d %d\n", data[0], data[k - 1]);
            continue;
        }
        dp[0] = 0;//初始化长度为0的序列和为0
        int t = 0;
        int first, final =
            0; //记录最大的和的连续子序列的起始下标和最终下标
        int max_len = numeric_limits<int>::min();
        for (int i = 1 ; i <= k ;
                i++) { //构建所有问题问题子规模的答案1-k(i为长度非下标)
            if (dp[i - 1] > 0) { //延续了之前序列 长度为i-1的子序列和大于0
                dp[i] = dp[i - 1] + data[i - 1]; //i-1本身作为子序列的终点下标
            } else { //长度为i-1的子序列和小于或者等于0-->新起了一段子序列
                dp[i] = data[i - 1];
                //更新数组的起始下标要减1
                // 因为i的取值范围是1-k 包含了k i代表的是长度非下标
                t = i - 1;
            }
            //更新最大连续子序列和的最大值及其起始和终点的下标
            if (dp[i] > max_len) {
                max_len = dp[i];
                first = t;
                final = i - 1; //下标要-1
            }
        }
        printf("%d %d %d\n", max_len, data[first], data[final]);
    }
    return 0;
}