#include <fstream>
#include <cstdio>
#include <cstring>
#define nmax 1000005
using namespace std;
pair <long long,pair <int,int> > p[nmax*2];
long long v[nmax],w[nmax],c[nmax],ans;
int n,m,h[nmax];
void dfs(int nod,long long cod,int niv)
{
if (nod<=n) {
c[nod]=cod;
h[nod]=niv;
}
if (nod>n)
ans+=p[nod].first;
if (p[nod].first>0) {
dfs(p[nod].second.first,cod*2,niv+1);
dfs(p[nod].second.second,cod*2+1,niv+1);
}
}
int main()
{
int i,j,k;
freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
memset(v,1,sizeof(v));
memset(w,1,sizeof(w));
scanf("%d",&n);
for (i=1;i<=n;i++)
scanf("%lld",&v[i]);
i=1,j=1;m=0;
for (k=n;k<2*n-1;) {
if (v[i+1]<w[j]) {
k++;
p[k]=make_pair(v[i]+v[i+1],make_pair(i,i+1));
m++;
w[m]=v[i]+v[i+1];
i+=2;
continue;
}
if (w[j+1]<v[i]) {
k++;
p[k]=make_pair(w[j]+w[j+1],make_pair(n+j,n+j+1));
m++;
w[m]=w[j]+w[j+1];
j+=2;
continue;
}
k++;
p[k]=make_pair(v[i]+w[j],make_pair(i,n+j));
m++;
w[m]=v[i]+w[j];
i++,j++;
}
dfs(2*n-1,0,0);
printf("%lld\n",ans);
for (i=1;i<=n;i++)
printf("%d %lld\n",h[i],c[i]);
return 0;
}