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>
#define min(a,b) ((a)<(b)?(a):(b))

int compare_int(const void *a,const void *b){
	return *(int*)a-*(int*)b;
}

int main(){
	int n,a[100000],i,j,mi=0,pr=0,ze=0,sho=100000,ans=0;
	scanf("%d",&n);
	for(i=0;i<n;i++){
		scanf("%d",&a[i]);
		if(a[i]<0)mi++;
		else if(a[i]>0)pr++;
		else ze++;
		sho=min(sho,abs(a[i]));
		ans+=abs(a[i]);
	}
	qsort(a,n,sizeof(int),compare_int);
	int anss[100000][2];
	if(mi>0&&pr>0){
		printf("%d\n",ans);
		anss[0][0]=a[0];
		anss[0][1]=a[n-1];
		for(i=1;i<pr-1;i++){
			anss[i][1]=a[n-1-i];
			anss[i][0]=anss[i-1][0]-anss[i-1][1];
		}
		for(i=0;i<mi-1;i++){
			anss[i+pr-1][1]=a[i+1];
			anss[i+pr-1][0]=anss[i-2+pr][0]-anss[i-2+pr][1];
		}
		anss[n-2][1]=anss[n-3][0]-anss[n-3][1];
		anss[n-2][0]=ans+anss[n-2][1];
		for(i=0;i<ze;i++){
			anss[i+pr+mi-2][0]=anss[i-1+pr+mi][0];
			anss[i+pr+mi-2][1]=0;
		}
	}else if(ze>0&&pr>0){
		printf("%d\n",ans);
		anss[0][0]=a[0];
		anss[0][1]=a[n-1];
		for(i=1;i<pr;i++){
			anss[i][1]=a[n-1-i];
			anss[i][0]=anss[i-1][0]-anss[i-1][1];
		}
		for(i=0;i<mi;i++){
			anss[i+pr][1]=a[i];
			anss[i+pr][0]=anss[i-1+pr][0]-anss[i-1+pr][1];
		}
		for(i=0;i<ze-1;i++){
			anss[i+pr+mi][0]=anss[i-1+pr+mi][0];
			anss[i+pr+mi][1]=0;
		}
	}else if(ze>0&&mi>0){
		printf("%d\n",ans);
		anss[0][0]=a[0];
		anss[0][1]=a[n-1];
		for(i=1;i<pr;i++){
			anss[i][1]=a[n-1-i];
			anss[i][0]=anss[i-1][0]-anss[i-1][1];
		}
		for(i=0;i<mi;i++){
			anss[i+pr][1]=a[i];
			anss[i+pr][0]=anss[i-1+pr][0]-anss[i-1+pr][1];
		}
		for(i=0;i<ze-1;i++){
			anss[i+pr+mi][0]=anss[i-1+pr+mi][0];
			anss[i+pr+mi][1]=0;
		}
	}
	else{
		if(pr==0&&mi==0){
			for(i=0;i<n-1;i++){
				anss[i][0]=0;
				anss[i][1]=0;
			}
		}
		else if(pr>0){
			printf("%d\n",ans-sho*2);
			anss[0][0]=a[0];
			anss[0][1]=a[n-1];
			for(i=1;i<pr-2;i++){
				anss[i][1]=a[n-1-i];
				anss[i][0]=anss[i-1][0]-anss[i-1][1];
			}
			anss[pr-2][0]=a[1];
			anss[pr-2][1]=anss[pr-3][0]-anss[pr-3][1];
		}
		else if(mi>0){
			printf("%d\n",ans-sho*2);
			anss[0][0]=a[n-1];
			anss[0][1]=a[0];
			for(i=1;i<mi-1;i++){
				anss[i][1]=a[i];
				anss[i][0]=anss[i-1][0]-anss[i-1][1];
			}
		}	
	}
	for(i=0;i<n-1;i++)printf("%d %d\n",anss[i][0],anss[i][1]);
	return 0;
}