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 <bits/stdc++.h>
using namespace std;

#define int long long
#pragma GCC optimize ("O3")
#define ll long long
#define vi vector <int>
#define vii vector <pair<int,int> >
#define rep(i,a,b) for (int i=a;i<b;i++)
#define repD(i,a,b) for (int i=a;i>b;i--)
#define pb push_back
#define pii pair <int,int>
#define ff first
#define ss second
#define all(a) a.begin(),a.end()
#define MOD 1000000007
#define PI 3.14159265359


/*#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/trie_policy.hpp>

using namespace __gnu_pbds;
typedef tree<pii,null_type,less <pii>,rb_tree_tag,tree_order_statistics_node_update>ind_set;
*/
///*X.find_by_order("index")
///X.order_of_key("key")



#define deb(x) cerr<<#x<< " : " <<x<<"\n";
#ifndef local
	#define deb(x) ;
#endif
///----------------------------------------------------------------------------------

int n,arr[100005];
void solve()
{
	cin>>n;rep(i,0,n)cin>>arr[i];
	sort(arr,arr+n);
	if (n&1)
	{
		int ansM=0;
		rep(i,0,n/2+1)ansM-=arr[i];
		rep(i,n/2+1,n)ansM+=arr[i];

		int ansP=0;
		rep(i,0,n/2)ansP-=arr[i];
		rep(i,n/2,n)ansP+=arr[i];

		if (ansP>ansM)
		{
			cout<<ansP<<"\n";

			stack<int> S;
			reverse(arr,arr+n);
			rep(i,0,n/2)S.push(arr[i]),S.push(arr[n/2+i+1]);
			S.push(arr[n/2]);

			while(S.size()!=1)
			{
				int a=S.top();S.pop();int b=S.top();S.pop();
				cout<<b<<" "<<a<<"\n";;
				S.push(b-a);
			}
		}
		else
		{
			cout<<ansM<<"\n";
			stack<int> S;
			//reverse(arr,arr+n);
			rep(i,0,n/2)S.push(arr[i]),S.push(arr[n/2+i+1]);
			S.push(arr[n/2]);

			while(S.size()!=1)
			{
				if (S.size()==2)
				{
					int a=S.top();S.pop();int b=S.top();S.pop();
					cout<<a<<" "<<b<<"\n";break;
				}
				int a=S.top();S.pop();int b=S.top();S.pop();

				cout<<b<<" "<<a<<"\n";
				S.push(b-a);
			}
		}

	}
	else
	{
		exit(1);
		int ans=0;
		if (n==2)
		{
			cout<<arr[1]-arr[0]<<"\n";
			cout<<arr[1]<<" "<<arr[0];
			return;
		}

		ans=arr[n-1]-arr[0];
		rep(i,1,n-1)ans+=abs(arr[i]);

		cout<<ans<<"\n";
		rep(i,1,n-1)
		{
			if (arr[i]>=0){cout<<arr[0]<<" "<<arr[i]<<"\n";arr[0]-=arr[i];}
		}
		cout<<arr[n-1]<<" "<<arr[0]<<"\n";
		arr[n-1]-=arr[0];
		rep(i,1,n-1)if (arr[i]<0)cout<<arr[n-1]<<" "<<arr[i]<<"\n";

		return;


	}

}

signed main()
{
    ios_base::sync_with_stdio(false);cin.tie(NULL);

    #ifdef local
    freopen("input.txt","r",stdin);
    ///freopen("output.txt","w",stdout);
    #endif

    clock_t qwertyuiop = clock();
    int t=1;
    ///cin>>t;
    rep(a,0,t)
    {
        ///cout<<"Case #"<<a+1<<": ";
        solve();
    }
    #ifdef local
	{qwertyuiop = clock() - qwertyuiop;double time_taken = ((double)qwertyuiop)/CLOCKS_PER_SEC;cerr<<fixed<<setprecision(5)<<"\n\nTime Taken : "<<time_taken<<" seconds\n";}
	#endif
}