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++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

//AtCoder 
#include <bits/stdc++.h>
using namespace std;
using ll=int64_t;

int main() {
#if LOCAL&01
    std::ifstream in("input.txt");
    std::cin.rdbuf(in.rdbuf());
#endif
    ll N;
    cin>>N;
    vector<ll> orig(N);
    vector<ll> pu,mi;
    for(auto&& t:orig){
        cin>>t;
        if (t>=0) pu.push_back(t);
        else mi.push_back(t);
    }
    auto aaa_func = [&](){
        auto pu2=pu;
        auto mi2=mi;
        ll ans=0;
        for(int i=1;i<pu.size();++i){
            mi[0] -= pu[i];            
        }
        for(int i=1;i<mi.size();++i){
            pu[0] -= mi[i];
        }
        cout<<pu[0]-mi[0]<<endl;

        for(int i=1;i<pu2.size();++i){
            mi2[0] -= pu2[i];            
            cout<<mi2[0]<<" "<<pu2[i]<<endl;            
        }
        for(int i=1;i<mi2.size();++i){
            pu2[0] -= mi2[i];
            cout<<pu2[0]<<" "<<mi2[i]<<endl;
        }
        cout<<pu2[0]<<" "<<mi2[0]<<endl;
    };
    if (pu.size()!=0 && mi.size()!=0){
        aaa_func();
        return 0;
    }


    sort(orig.begin(),orig.end());
    auto tbl=orig;
    auto tbl2=tbl;

    while(tbl.size()>2){
        tbl[0] -= tbl.back();
        tbl.pop_back();
    }
    ll ans=tbl[1]>tbl[0]?tbl[1]-tbl[0]:tbl[0]-tbl[1];
    //cout<<ans<<endl;

    reverse(tbl2.begin(),tbl2.end());
    while(tbl2.size()>2){
        tbl2[0] -= tbl2.back();
        tbl2.pop_back();
    }
    ll ans2=tbl2[1]>tbl2[0]?tbl2[1]-tbl2[0]:tbl2[0]-tbl2[1];
    //cout<<ans2<<endl;

    if(ans>=ans2){
        cout<<ans<<endl;
    } else {
        cout<<ans2<<endl;
        reverse(orig.begin(),orig.end());
    }
    while(orig.size()>2){
        cout<<orig[0]<<" "<<orig.back()<<endl;
        orig[0] -= orig.back();
        orig.pop_back();
    }
    if(orig[1]>orig[0]){
        cout<<orig[1]<<" "<<orig[0]<<endl;
    } else {
        cout<<orig[0]<<" "<<orig[1]<<endl;
    }
#if 0
    ll N;
    cin>>N;
    vector<ll> pl;
    vector<ll> mi;
    for(int i=0;i<N;++i){
        ll a;
        cin>>a;
        if(a>=0) pl.push_back(a);
        else mi.push_back(a);
    }
    sort(pl.begin(),pl.end());
    sort(mi.begin(),mi.end());
    ll ans=0;
    if(pl.size()==0){
    } else if(mi.size()==0){
    }
#endif
    return 0;
}