#include <fstream>
#include <bitset>
#include <cstring>
#include <climits>
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
long long n,i,j,k,v[1000010],niv,m,cost,C[2000010],N[2000010],w[1000010];
pair<long long, pair<int , int> > L[2000010];
void dfs(int nod, long long cod){
niv++;
if(nod>n)
cost+=L[nod].first;
else{
C[nod]=cod;
N[nod]=niv;
}
if(L[nod].first>0){
dfs(L[nod].second.first,cod<<1);
dfs(L[nod].second.second,(cod<<1)+1);
}
niv--;
}
int main(){
fin>>n;
memset(v, 1, sizeof(v));
memset(w, 1, sizeof(w));
for(i=1;i<=n;i++){
fin>>v[i];
}
k=n;
j=1;
i=1;
while(k<2*n-1){
if(v[i+1]<=w[j]){
w[++m]=v[i]+v[i+1];
L[++k]={w[m],{i,i+1}};
i+=2;
continue;
}
if(w[j+1]<=v[i]){
w[++m]=w[j]+w[j+1];
L[++k]={w[m],{n+j,n+j+1}};
j+=2;
continue;
}
w[++m]=v[i]+w[j];
L[++k]={w[m],{i,n+j}};
i++,j++;
}
niv=-1;
dfs(2*n-1,0);
fout<<cost<<"\n";
for(i=1;i<=n;i++)
fout<<N[i]<<" "<<C[i]<<"\n";
return 0;
}