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)

#include <bits/stdc++.h>
#define FOR(i,k,n)  for(int i = (k);i < (n);++i)
#define REP(i,n)    FOR(i,0,n)
#define ALL(x)      begin(x),end(x)

using namespace std;
using vecint = vector<int>;
using ll = int64_t;

int main()
{
  int n;
  cin>>n;
  bool zero=false;
  bool pos=false;
  bool neg=false;
  int sum=0;
  int mn=10000;
  int mni=0;
  vecint vp,vz,vn,v;
  REP(i,n) {
    int a;
    cin>>a;
    v.push_back(a);
    if(a<0) {
      neg=true;
      vn.push_back(a);
    } else if (a>0) {
      pos=true;
      vp.push_back(a);
    } else {
      zero=true;
      vz.push_back(a);
    }
    sum+=abs(a);
    if (abs(a) < mn) {
      mn=abs(a);
      mni=i;
    }
  }
  if ((zero+pos+neg)>1) {
    cout << sum << endl;
    if(!pos) {
      vp.insert(end(vp),ALL(vz));
    } else if (!neg) {
      vn.insert(end(vn),ALL(vz));
    } else {
      vp.insert(end(vp),ALL(vz));
    }
    while(vn.size()>1) {
      int an = vn.back();
      vn.pop_back();
      int ap = vp.back();
      vp.pop_back();
      cout<<ap<<' '<<an<<endl;
      vp.push_back(ap-an);
    }
    int old=vn[0];
    REP(i,vp.size()-1){
      cout<<old<<' '<<vp[i]<<endl;
      old=old-vp[i];
    }
    cout<<vp.back()<<' '<<old<<endl;
  } else if (n > 2) {
    cout << (sum-2*mn) << endl;
    vecint ind;
    REP(i,n) {
      if(i==mni) continue;
      ind.push_back(i);
    }
    cout<<mn<<' '<<v[ind[0]]<<endl;
    int old=mn-v[ind[0]];
    FOR(i,1,n-2) {
      cout<<old<<' '<<v[ind[i]]<<endl;
      old = old-v[ind[i]];
    }
    if (pos) {
      cout<<v[ind.back()]<<' '<<old<<endl;
    } else {
      cout<<old<<' '<<v[ind.back()]<<endl;
    }
  } else {
    cout << (sum-2*mn) << endl;
    int ind = 1-mni;
    cout<<mn<<' '<<v[ind]<<endl;
  }
  return 0;
}