#include <bits/stdc++.h>
using namespace std;
ifstream f("huffman.in");
ofstream g("huffman.out");
typedef int64_t Int;
const Int oo=1000000000000000010LL;
const int N = 2000002;
int n,F[2][N],lg[N],t,f11,f12,f21,f22;
Int v[N],sol,C[N],val11,val12,val21,val22,val;
pair<Int,int> s[4];
bitset<N> used;
int main()
{
f>>n;
for(int i=1; i<=n; i++)
f>>v[i];
f11=1;
f12=2;
f21=n+1;
f22=n+2;
t=n+1;
while(t<2*n)
{
/// fac un vector cu valorile din pozitiile posibile
val11=f11<=n?v[f11]:oo;
s[0]=make_pair(val11,f11);
val12=f12<=n?v[f12]:oo;
s[1]=make_pair(val12,f12);
val21=f21<t?v[f21]:oo;
s[2]=make_pair(val21,f21);
val22=f22<t?v[f22]:oo;
s[3]=make_pair(val22,f22);
/// sortez dupa valori
sort(s,s+4);
/// aleg cele mai mici doua valori si vizitez pozitiile lor
/// distribui pozitiile ca fii pentru tata si vizitez
tie(val,F[0][t])=s[0];
used[F[0][t]]=1;
v[t]+=val;
tie(val,F[1][t])=s[1];
used[F[1][t]]=1;
v[t]+=val;
sol+=v[t];
/// reasez pozitiile posibile
while(used[f11])f11++;
f12=f11+1;
while(used[f21])f21++;
f22=f21+1;
/// merg mai departe
t++;
}
g<<sol<<'\n';
for(int i=2*n-1;i>=2;i--)
{
int st=F[0][i],dr=F[1][i];
C[st]=2*C[i];
C[dr]=2*C[i]+1;
lg[st]=lg[dr]=lg[i]+1;
}
for(int i=1;i<=n;i++)
g<<lg[i]<<' '<<C[i]<<'\n';
}