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: Runtime Error)

#include <iostream>
#include <vector>
#include <algorithm> // sort
#include <map> // pair
#include <numeric> // accumulate(begin,end,初期値)


// ------------debug用------------
#define FALSE cout<<"false"<<endl;
#define TRUE cout<<"true"<<endl;
// ------------debug用------------


// ------------計算用------------
#define ALL(x) (x).begin(),(x).end()
#define FOR(x) for(ll i = 0;i < x;++i)
// ------------計算用------------


// ------------出力用------------
#define PRINT(x) cout<<x<<endl;
// ------------出力用------------


using namespace std;
typedef long long ll;

int main(){
  int N;
  cin>>N;
  vector<int> A(N);
  FOR(N)cin>>A[i];
  sort(ALL(A));
  ll ans = 0;
  vector<int> absA(N);
  vector<int> minusA;
  vector<int> plusA;
  for(int i = 0;i < N;i++){
    absA[i] = abs(A[i]);
    if(A[i] < 0){
      minusA.push_back(A[i]);
    }else{
      plusA.push_back(A[i]);
    }
    ans += absA[i];
  }
  sort(ALL(absA));
  
  if(!(A[0] < 0 && A[N - 1] > 0)){
    bool dame = false;
    for(int i = 0;i < N;i++){
      if(absA[i] == 0){
        dame = true;
        break;
      }
    }
    if(!dame){
        ans -= absA[0] * 2;
    }
  }
  
  cout<<ans<<endl;
  
  
  
  
  for(int i = 0;i < N - 1;i++){
    
    if(minusA.empty()){
      bool iszero = false;
      for(int j = 0;j < plusA.size();j++)if(plusA[j] == 0)iszero = true;
      if(iszero){
        int tmp,tmp2;
        for(int j = 0;j < plusA.size();j++)if(plusA[j] == 0)tmp = j;
        for(int j = 0;j < plusA.size();j++)if(plusA[j] != 0)tmp2 = j;
		
        if(i == N - 3){
                cout<< plusA[tmp] << " " << plusA[tmp2] << endl;
        plusA[tmp] -= plusA[tmp2];
        if(plusA[tmp] < 0){minusA.push_back(plusA[tmp]);plusA.erase(plusA.begin() + tmp2);}
        plusA.erase(plusA.begin() + tmp2);
        }
        cout<< plusA[tmp2] << " " << plusA[tmp] << endl;
        plusA[tmp2] -= plusA[tmp];
        if(plusA[tmp2] < 0){minusA.push_back(plusA[tmp2]);plusA.erase(plusA.begin() + tmp2);}
        plusA.erase(plusA.begin() + tmp);
        continue;
      }
      
      cout<< plusA[0] << " " << plusA[plusA.size()-1] << endl;
      plusA[0] -= plusA[plusA.size()-1];
      if(plusA[0] < 0){minusA.push_back(plusA[0]);plusA.erase(plusA.begin());}
      plusA.erase(plusA.begin() + plusA.size()-1);
      continue;
    }
    
    if(plusA.empty()){
      cout<< minusA[minusA.size()-1] << " " << minusA[0] << endl;
      minusA[minusA.size()-1] -= minusA[0];
      if(minusA[minusA.size()-1] >= 0){plusA.push_back(minusA[minusA.size()-1]);minusA.erase(minusA.begin() + minusA.size()-1);}
      minusA.erase(minusA.begin());
      continue;
    }
    
    bool PlusBigger = plusA.size() > minusA.size();
    
    //if(i == N - 2)PlusBigger = false;
    
	if(PlusBigger){
      cout<< minusA[0] << " " << plusA[0] << endl;
      minusA[0] -= plusA[0];
      plusA.erase(plusA.begin());
    }else{
      cout<< plusA[0] << " " << minusA[0] << endl;
      plusA[0] -= minusA[0]; 
      minusA.erase(minusA.begin());
    }
  }
  
  return 0;
}