Problem:
Score : 500 points

Problem Statement

There are N integers, A_1, A_2, ..., A_N, written on a blackboard.

We will repeat the following operation N-1 times so that we have only one integer on the blackboard.

Choose two integers x and y on the blackboard and erase these two integers. Then, write a new integer x-y.

Find the maximum possible value of the final integer on the blackboard and a sequence of operations that maximizes the final integer.

Constraints

2 \leq N \leq 10^5

-10^4 \leq A_i \leq 10^4

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
A_1 A_2 ... A_N

Output

Print the maximum possible value M of the final integer on the blackboard, and a sequence of operations x_i, y_i that maximizes the final integer, in the format below.

Here x_i and y_i represent the integers x and y chosen in the i-th operation, respectively.

If there are multiple sequences of operations that maximize the final integer, any of them will be accepted.

M
x_1 y_1
:
x_{N-1} y_{N-1}

Sample Input 1

3
1 -1 2

Sample Output 1

4
-1 1
2 -2

If we choose x = -1 and y = 1 in the first operation, the set of integers written on the blackboard becomes (-2, 2).

Then, if we choose x = 2 and y = -2 in the second operation, the set of integers written on the blackboard becomes (4).

In this case, we have 4 as the final integer. We cannot end with a greater integer, so the answer is 4.

Sample Input 2

3
1 1 1

Sample Output 2

1
1 1
1 0

Solution in C (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<stdbool.h>
typedef long long ll;
typedef long double ld;
#define rep(i,l,r)for(ll i=(l);i<(r);i++)
#define repp(i,l,r,k)for(ll i=(l);i<(r);i+=(k))
#define rrep(i,l,r)for(ll i=(l);i>=(r);i--)
#define INF (1LL<<60)
#define MOD1 1000000007
#define MAX_N (1 << 17)
#define YES printf("Yes\n")
#define NO printf("No\n")


void swap(ll *a, ll *b){ll c;c=*b;*b=*a;*a=c;}
ll max2(ll a,ll b){return a>=b?a:b;}
ll min2(ll a,ll b){return a>=b?b:a;}
ll minn(ll n, ll a[n]){ll b=INF;rep(i,0,n) b=min2(b,a[i]);return b;}
ll maxn(ll n, ll a[n]){ll b=-INF;rep(i,0,n) b=max2(b,a[i]);return b;}
ll ABS(ll a){return a>=0?a:(-a);}
ll POW(ll a, ll b){ll c=1;rep(i,0,b) c*=a;return c;}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll mod(ll n){return n%=MOD1;}
int upll(const void*a, const void*b){return*(ll*)a<*(ll*)b?-1:*(ll*)a>*(ll*)b?1:0;}
int downll(const void*a, const void*b){return*(ll*)a<*(ll*)b?1:*(ll*)a>*(ll*)b?-1:0;}
void sortup(ll*a,int n){qsort(a,n,sizeof(ll),upll);}
void sortdown(ll*a,int n){qsort(a,n,sizeof(ll),downll);}

typedef struct{
    ll aa;
    ll bb;
}frequent;

int main(void){
    // char ;
    ll n;
    scanf("%lld",&n);
    ll a[n],x[n-1],y[n-1];
    rep(i,0,n){
        scanf("%lld",&a[i]);
    }

    if(n==2){
        printf("%lld\n",ABS(a[0]-a[1]));
        printf("%lld %lld\n",max2(a[0],a[1]),min2(a[0],a[1]));
        return 0;
    }

    sortup(a,n);

    x[0]=a[0];
    y[0]=a[1];
    rep(i,1,n-2){
        x[i]=x[i-1]-y[i-1];
        y[i]=a[i+1];
    }
    x[n-2]=a[n-1];
    y[n-2]=x[n-3]-y[n-3];


    // if(n%2==0){
    //     x[0] = a[n-1];
    //     y[0] = a[0];
    //     rep(i,1,n-1){
    //         if(i%2){
    //             x[i] = a[i/2];
    //         }else{
    //             x[i] = a[n-2-i/2];
    //         }
    //         y[i] = x[i-1]-y[i-1];
    //     }
    // }else{
    //     x[0] = a[0];
    //     y[0] = a[n-1];
    //     rep(i,1,n-1){
    //         if(i%2){
    //             x[i] = a[n-2-i/2];
    //         }else{
    //             x[i] = a[i/2];
    //         }
    //         y[i] = x[i-1]-y[i-1];
    //     }
    // }


    // x[0]=a[0];
    // y[0]=a[n-2];
    // rep(i,1,n-2){
    //     x[i] = x[i-1]-y[i-1];
    //     y[i] = a[n-2-i];
    // }
    // x[n-2] = a[n-1];
    // y[n-2] = x[n-3]-y[n-3];
    printf("%lld\n",x[n-2]-y[n-2]);
    rep(i,0,n-1){
        printf("%lld %lld\n",x[i],y[i]);
    }
    return 0;
}