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 Java8 (OpenJDK 1.8.0) (judge verdict: Wrong Answer)

import java.util.Scanner;
import java.util.ArrayList;
import java.util.Collections;
public class Main{
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		boolean high=false;
		boolean low=false;
		int zero=0;
		long sum=0;
		ArrayList<Integer> llist=new ArrayList<>();
		ArrayList<Integer> hlist=new ArrayList<>();
		for(int i=0; i<n; i++){
			int a=sc.nextInt();
			sum+=Math.abs(a);
			if(a>0){
				hlist.add(a);
				high=true;
			}else if(a<0){
				llist.add(a);
				low=true;
			}else{
				zero++;
			}
		}
		if(sum==0){
			System.out.println(sum);
			for(int i=1; i<zero; i++){
				System.out.println("0"+" "+"0");
			}
			return;
		}
		int cl=0;
		int ch=0;
		String s="";
		if(!(high && low)){
			if(zero>0){
				if(low){
					hlist.add(-llist.get(cl++));
					s="0 "+String.valueOf(llist.get(0));
					zero--;
				}else{
					llist.add(-hlist.get(ch++));
					s="0 "+String.valueOf(hlist.get(0));
					zero--;
				}
			}else{
			if(low){
				Collections.sort(llist);
				Collections.reverse(llist);
				System.out.println(llist.get(0)+" "+llist.get(1));
				hlist.add(llist.get(0)-llist.get(1));
				cl+=2;
				sum+=2*llist.get(0);
				s=String.valueOf(llist.get(0))+" "+String.valueOf(llist.get(1));
			}else{
				Collections.sort(hlist);
				llist.add(hlist.get(0)-hlist.get(1));
				ch+=2;
				sum-=2*hlist.get(0);
				s=String.valueOf(hlist.get(0))+" "+String.valueOf(hlist.get(1));
			}
			}
		}
		int ii=0;
		int jj=0;
		System.out.println(sum);
		if(!s.equals("")){
			System.out.println(s);
		}
		int lsize=llist.size();
			while(lsize>cl+1){
				ii=hlist.get(ch++);
				jj=llist.get(cl++);
				hlist.add(ii-jj);
				System.out.println(ii+" "+jj);
			}
		int hsize=hlist.size();
			while(hsize>ch+1){
				 ii=llist.get(cl++);
				 jj=hlist.get(ch++);
				llist.add(ii-jj);
				System.out.println(ii+" "+jj);
			}
			System.out.println(hlist.get(ch)+" "+llist.get(cl));
		for(int i=0; i<zero; i++){
			System.out.println(sum+" "+0);
		}
	}
}