#include <bits/stdc++.h>
#define rep(i,n) for(int i=0; i<(int)(n); i++)

using namespace std;
const int Max_N=2e5, Max_A=1e8;
const int INF=1e9;

int main(){
	int N;
	cin >> N;
	assert(N>=3 && N<=Max_N);
	vector<int> A(N), test(N);
	rep(i,N){
		int a;
		cin >> a;
		assert(a>=1 && a<=Max_A);
		A[i]=a, test[i]=a;
	}
	sort(test.begin(),test.end());
	rep(i,N-1) assert(test[i] != test[i+1]);
	//最小値を探す
	int m=INF, m_pos;
	rep(i,N){
		if(A[i] < m){
			m=A[i];
			m_pos=i;
		}
	}
	//左からi番目までの最小値
	vector<int> min_left(N);
	int ML=INF;
	rep(i,N){
		ML=min(ML,A[i]);
		min_left[i]=ML;
	}
	//右からi番目までの最小値
	vector<int> min_right(N);
	int MR=INF;
	rep(i,N){
		MR=min(MR,A[N-1-i]);
		min_right[N-1-i]=MR;
	}
	int ans=INF;
	//最小値が真ん中のケース
	if(m_pos >= 1 && m_pos < N-1){
		ans=min_left[m_pos-1]+m+min_right[m_pos+1];
	}
	//最小値が左右のケース、真ん中全探索
	int res=INF;
	for(int i=1; i<N-1; i++){
		if(i == m_pos) continue;
		//最小値が一番右
		if(i < m_pos){
			int left=min_left[i-1];
			if(left > A[i]) continue;
			int size=left+A[i]+m;
			res=min(res,size);
		}
		//最小値が一番左
		if(i > m_pos){
			int right=min_right[i+1];
			if(right > A[i]) continue;
			int size=m+A[i]+right;
			res=min(res,size);
		}
	}
	ans=min(ans,res);
	if(ans==INF) cout << -1 << endl;
	else cout << ans << endl;

	return 0;
}