#include <stdio.h>
#include <vector>
#include <queue>
constexpr int NIL = -1;
using ll = long long;
int main() {
FILE *fin = fopen( "huffman.in", "r" );
FILE *fout = fopen( "huffman.out", "w" );
int n;
fscanf( fin, "%d", &n );
std::vector<ll> v(n);
std::vector<int> left(n, NIL), right(n, NIL);
for( int i = 0; i < n; i++ )
fscanf( fin, "%lld", &v[i] );
std::queue<int> q1, q2;
for( int i = 0; i < n; i++ )
q1.push( i );
while( (int)q1.size() + (int)q2.size() > 1 ){
int a, b;
if( q2.empty() || (!q1.empty() && v[q1.front()] < v[q2.front()]) ){
a = q1.front();
q1.pop();
}else{
a = q2.front();
q2.pop();
}
if( q2.empty() || (!q1.empty() && v[q1.front()] < v[q2.front()]) ){
b = q1.front();
q1.pop();
}else{
b = q2.front();
q2.pop();
}
v.push_back( v[a] + v[b] );
left.push_back( a );
right.push_back( b );
q2.push( (int)v.size() - 1 );
}
std::vector<int> len(v.size());
std::vector<ll> val(v.size());
len.back() = 0;
val.back() = 0;
for( int i = (int)v.size(); i--; ){
if( i < n ) continue;
len[left[i]] = 1 + len[i];
val[left[i]] = 2 * val[i];
len[right[i]] = 1 + len[i];
val[right[i]] = 2 * val[i] + 1;
}
ll ans = 0;
for( int i = 0; i < n; i++ )
ans += len[i] * (ll)v[i];
fprintf( fout, "%lld\n", ans );
for( int i = 0; i < n; i++ )
fprintf( fout, "%d %lld\n", len[i], val[i] );
fclose( fin );
fclose( fout );
return 0;
}