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)

#define _USE_MATH_DEFINES
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<stdbool.h>
#include<math.h>
#include<sstream>
#include<math.h>
#include<vector>
#include<functional>
#include<queue>
#include<utility>
#include<bitset>
#include<time.h>
#include<map>
typedef long long ll;
#define N (1000000000+7)
#define INF 1e16
using namespace std;
typedef pair<ll, ll> P;


int main(void) {
	ll n, x, ans = 0, z = 0;
	cin >> n;
	vector<ll>a,b,l, r;
	for (ll i = 0;i < n;i++) {
		cin >> x;
		if (x == 0)z++;
		if (x > 0)a.push_back(x);
		else b.push_back(x);
	}
	if (b.empty()) {
		for (ll i = 0;i < n;) {
			for (ll i = 0;i < z;i++)a.push_back(0);
			if (i == 0) {
				l.push_back(a[0]);
				r.push_back(a[1]);
				ans = a[0] - a[1];
				i = 2;
			}
			else {
				if (i == n - 1) {
					l.push_back(a[i]);
					r.push_back(ans);
					ans = a[i] - ans;
					i++;
				}
				else {
					r.push_back(a[i]);
					l.push_back(ans);
					ans = ans - a[i];
					i++;
				}
			}
		}
	}
	else {
		if (a.empty()) {
			sort(b.begin(), b.end(), greater<ll>());
			for (ll i = 0;i < n;) {
				if (i == 0) {
					l.push_back(b[0]);
					r.push_back(b[1]);
					ans = b[0] - b[1];
					i = 2;
				}
				else {
					l.push_back(ans);
					r.push_back(b[i]);
					ans = ans - b[i];
					i++;
				}
			}
		}
		else {
			auto itr1 = a.begin();
			auto itr2 = b.begin();
			while ((ll)a.size()>1) {
				itr1 = a.begin();
				itr2 = b.begin();
				ans = *itr2 - *itr1;
				l.push_back(*itr2);
				r.push_back(*itr1);
				a.erase(itr1);
				b.erase(itr2);
				b.push_back(ans);
			}
			while (!b.empty()) {
				itr1 = a.begin();
				itr2 = b.begin();
				ans = *itr1 - *itr2;
				l.push_back(*itr1);
				r.push_back(*itr2);
				a.erase(itr1);
				b.erase(itr2);
				a.push_back(ans);
			}
		}
	}
	cout << ans << endl;
	for (ll i = 0;i < (ll)l.size();i++) {
		cout << l[i] << " " << r[i] << endl;
	}
	return 0;
}