#define _CRT_SECURE_NO_WARNINGS
#define MATH_PI 3.14159265358979323846264338327950288419716939
#define DIVIDER9 1000000007
#define lli long long int
#include <iostream>
#include <string.h>
#include <fstream>
#include <math.h>
using namespace std;

#ifdef _WIN32
#pragma warning(disable : 4101)


signed wait(){
	char wait_dummy[256];
	scanf("%c", &wait_dummy);
	return 0;
}


template <typename ... Args>
void dout(const char *format, Args const & ... args){
	printf(format, args ...);
}

#define MAX_CHARBUF	65536
#define DATAFILE "data.dat"

class csLocalInput{
	int FileOpen();
public:
	FILE *fp;
	csLocalInput();
};


csLocalInput::csLocalInput() {
	FileOpen();
}

int csLocalInput::FileOpen() {
	fp = fopen(DATAFILE, "rt");
	return 1;
}

csLocalInput local_in;


#define DEBUG	1
#else
inline signed wait() { return 0; }
inline void dout(const char *arg, ...) {}
#endif

template<typename T>inline void SWAP(T &a, T &b) { T t = a; a = b; b = t; }
inline void CSWAP(char *&a, char *&b) { char *t = a; a = b; b = t; }

#define CLIP(ptr, min, max) {if((min)<=(max)){if(ptr<(min)){ptr=(min);}if(ptr>(max)){ptr=(max);}}}


#define Sin(deg) sin((deg)*MATH_PI/180.0)
#define Cos(deg) cos((deg)*MATH_PI/180.0)
#define Tan(deg) tan((deg)*MATH_PI/180.0)
#define Rad(deg) ((deg)*MATH_PI/180.0)
#define rep(param, num) for(int param=0 ; param<num ; ++param)
#define fi(num) for(int i=0 ; i<num ; ++i)
#define fj(num) for(int j=0 ; j<num ; ++j)
#define fk(num) for(int k=0 ; k<num ; ++k)
#define fl(num) for(int l=0 ; l<num ; ++l)
#define fn(num) for(int n=0 ; n<num ; ++n)
#define ffr(param, num) for(int param=num-1 ; param>=0 ; --param)
#define fir(num) for(int i=num-1 ; i>=0 ; --i)
#define fjr(num) for(int j=num-1 ; j>=0 ; --j)
#define fkr(num) for(int k=num-1 ; k>=0 ; --k)
#define flr(num) for(int l=num-1 ; l>=0 ; --l)
#define fnr(num) for(int n=num-1 ; n>=0 ; --n)
#define gi(p) int p; ud_gi(p)
#define gi2(p1, p2) int p1, p2; ud_gi2(p1, p2)
#define gi3(p1, p2, p3) int p1, p2, p3; ud_gi3(p1, p2, p3)
#define gi4(p1, p2, p3, p4) int p1, p2, p3, p4; ud_gi4(p1, p2, p3, p4)
#define glli(p) lli p; ud_glli(p)
#define glli2(p1, p2) lli p1, p2; ud_glli2(p1, p2)
#define glli3(p1, p2, p3) lli p1, p2, p3; ud_glli3(p1, p2, p3)
#define glli4(p1, p2, p3, p4) lli p1, p2, p3, p4; ud_glli4(p1, p2, p3, p4)
#define gf(p) double p; ud_gf(p);
#define gf2(p1, p2) double p1, p2; ud_gf2(p1, p2);
#define gf3(p1, p2, p3) double p1, p2, p3; ud_gf3(p1, p2, p3);
#define gf4(p1, p2, p3, p4) double p1, p2, p3, p4; ud_gf4(p1, p2, p3, p4);

#define ud_gi(p) Scanf("%d", p)
#define ud_gi2(p1, p2) Scanf2("%d %d", p1, p2)
#define ud_gi3(p1, p2, p3) Scanf3("%d %d %d", p1, p2, p3)
#define ud_gi4(p1, p2, p3, p4) Scanf4("%d %d %d %d", p1, p2, p3, p4)
#define ud_glli(p) Scanf("%lld", p)
#define ud_glli2(p1, p2) Scanf2("%lld %lld", p1, p2)
#define ud_glli3(p1, p2, p3) Scanf3("%lld %lld %lld", p1, p2, p3)
#define ud_glli4(p1, p2, p3, p4) Scanf4("%lld %lld %lld %lld", p1, p2, p3, p4)
#define ud_gf(p) Scanf("%f", p)
#define ud_gf2(p1, p2) Scanf2("%f %f", p1, p2)
#define ud_gf3(p1, p2, p3) Scanf3("%f %f %f", p1, p2, p3)
#define ud_gf4(p1, p2, p3, p4) Scanf4("%f %f %f %f", p1, p2, p3, p4)

#ifdef DEBUG
#define gc(buf) fscanf(local_in.fp, "%s", buf)
#define Scanf(expr, p) fscanf(local_in.fp, expr, &p)
#define Scanf2(expr, p1, p2) fscanf(local_in.fp, expr, &p1, &p2)
#define Scanf3(expr, p1, p2, p3) fscanf(local_in.fp, expr, &p1, &p2, &p3)
#define Scanf4(expr, p1, p2, p3, p4) fscanf(local_in.fp, expr, &p1, &p2, &p3, &p4)
#else
#define gc(buf) Scanf("%s", buf)
#define Scanf(expr, p) scanf(expr, &p)
#define Scanf2(expr, p1, p2) scanf(expr, &p1, &p2)
#define Scanf3(expr, p1, p2, p3) scanf(expr, &p1, &p2, &p3)
#define Scanf4(expr, p1, p2, p3, p4) scanf(expr, &p1, &p2, &p3, &p4)
#endif
#define ans(p) cout << p << endl;
void CombSort(int N, lli *ar, int order_ascending = 1) { int h = int(N / 1.3); int flag; int i; while (true) { flag = 0; for (i = 0; i + h < N; ++i) { if ((order_ascending&&ar[i] > ar[i + h]) || (!order_ascending&&ar[i] < ar[i + h])) { swap<lli>(ar[i], ar[i + h]); flag = 1; } }if (h == 1 && !flag)break; if (h == 9 || h == 10) h = 11; if (h > 1)h = int(h / 1.3); } }

int EuclideanAlgorithm(int N, int *ar){
	fn(N - 1){
		while (true){ 
			if (ar[n] % ar[n + 1] == 0 || ar[n + 1] % ar[n] == 0) {
				ar[n + 1] = ar[n] < ar[n + 1] ? ar[n] : ar[n + 1];
				break; 
			}
			if (ar[n] > ar[n + 1]) {
				ar[n] %= ar[n + 1];
			} 
			else { 
				ar[n + 1] %= ar[n]; 
			} 
		} 
	}
	return ar[N - 1];
}


#include <vector>
#include <algorithm>

struct UnionFind {
	vector<int> par; 

	UnionFind(int N) : par(N) { 
		for (int i = 0; i < N; i++) par[i] = i;
	}

	int root(int x) { 
		if (par[x] == x) return x;
		return par[x] = root(par[x]);
	}

	void unite(int x, int y) { 
		int rx = root(x); 
		int ry = root(y); 
		if (rx == ry) return; 
		par[rx] = ry; 
	}

	bool same(int x, int y) { 
		int rx = root(x);
		int ry = root(y);
		return rx == ry;
	}
};


void Replace(char *c, int len, char before, char after) {
	fi(len){
		if(c[i] == before) c[i] = after;
	}
}
void Replace(char *c, char before, char after){
	int len = strlen(c);
	Replace(c, len, before, after);
}

class csNode{
public:
	csNode(){
	}

};

char s[200010];


int nP, nM;
lli P[100010] = {0}, M[100010] = {0};
lli history[100010][2] = {0};

signed main() {

	lli op;
	gi(n);

	nP = nM = 0;
	int num = 0;

	lli sum = 0;

	fi(n){
		ud_glli(op);
		if(op >= 0){
			P[nP++] = op; 
		}
		if(op < 0){
			M[nM++] = op;
		}
		num++;

		sum += abs(op);

	}
	
	if(num == 2){
		if(nP == 2){
			op = P[1] - P[0];
			ans(op);
			sprintf(s, "%lld %lld", P[1], P[0]);
			ans(s);
		}
		if(nP == 1){
			op = P[0] - M[0];
			ans(op);
			sprintf(s, "%lld %lld", P[0], M[0]);
			ans(s);
		}
		if(nP == 0){
			op = M[0] - M[1];
			ans(op);
			sprintf(s, "%lld %lld", M[0], M[1]);
			ans(s);
		}
		return wait();
	}

	int pp1 = 0, pp2 = 1;
	int pm = 0, ph = 0;

	if(nP > 1) CombSort(nP, P, 1);
	if(nM > 1) CombSort(nM, M, 0);

	if(nP == 0){
		sum -= abs(M[0]) * 2;
		history[ph][0] = M[0];
		history[ph][1] = M[1];
		op = M[0] - M[1];
		P[0] = op;
		nP++;

		M[0] = 0;
		M[1] = 0;
		fi(nM-2){
			M[i] = M[i+2];
			M[i+2] = 0;
		}
		nM -= 2;
		ph++;
		num--;
	}
	if(nM == 0){
		sum -= abs(P[0]) * 2;
		history[ph][0] = P[0];
		history[ph][1] = P[1];
		op = P[0] - P[1];
		M[0] = op;
		nM++;

		P[0] = 0;
		P[1] = 0;
		fi(nP - 2) {
			P[i] = P[i + 2];
			P[i + 2] = 0;
		}
		nP -= 2;
		ph++;
		num--;
	}

	nP = nP;

	if(nP >= nM + 2){
		
	}

	

	int pp = 0;
	pm = 0;

	while(true){
		if(nP <= nM - 1){
			history[ph][0] = P[pp];
			history[ph][1] = M[pm];
			op = P[pp] - M[pm];
			P[pp] = op;
			M[pm] = 0;
			pm++;
			nM--;
		}
		else{
			history[ph][1] = P[pp];
			history[ph][0] = M[pm];
			op = -(P[pp] - M[pm]);
			P[pp] = 0;
			M[pm] = op;
			pp++;
			nP--;
		}

		ph++;
		num--;
		if(num == 1) break;

	}

	ans(sum);

	lli mn, mx;

	fi(ph){
		if(i < ph - 1){
			sprintf(s, "%lld %lld", history[i][0], history[i][1]);
		}else{
			mn = min(history[i][0], history[i][1]);
			mx = max(history[i][0], history[i][1]);

			sprintf(s, "%lld %lld", mx, mn);
		}
		ans(s);
	}


	return wait();
}


Measured memory_bytes: 4224