//添加一个大小为2的数组记录起点和终点
//终点易确定,只要序列值增加,更新终点
//记录每次起点,序列值增加更新最大起点(序列值增加未必有新起点)
#include<iostream>
#include<cstdio>
#include<queue>
#include<climits>
using namespace std;
const int MAXN =10000;
int dp[MAXN];
int ans[2]={0,0};
int arr[MAXN];
void Function(int n){
int answer =INT_MIN;
int start;//每次更新的节点
int maxstart;//重点记录每次起点得到的最大序列的起点值
for(int i=0;i<n ; i++){
if(i==0){
dp[i]=arr[i];
start=0;
}else{
if(arr[i]>arr[i]+dp[i-1]){
dp[i]=arr[i];
start=i;//新起点
}else{
dp[i]=dp[i-1]+arr[i];
}
}
if(answer <dp[i]){
answer=dp[i];
maxstart =start;//得到更大值,更新最大起点
ans[1] = arr[i];
}
}
cout<<answer<<" "<<arr[maxstart]<<" "<<ans[1]<<endl;
return;
}
int main(){
int n;
while(scanf("%d",&n) != EOF){
if(n==0){
break;
}
for(int i=0;i<n;i++){
scanf("%d",&arr[i]);
}
Function(n);
}
return 0;
}