#include <iostream>
#include <sstream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <cstring>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <set>
#include <bitset>
#include <numeric>
#include <utility>
#include <iomanip>
#include <algorithm>
#include <functional>
#include <unordered_map>
using namespace std;

template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }

template<class T> vector<T> make_vec(size_t a) { return vector<T>(a); }
template<class T, class... Ts> auto make_vec(size_t a, Ts... ts) {
  return vector<decltype(make_vec<T>(ts...))>(a, make_vec<T>(ts...));
}
template<class T, class V>
typename enable_if<is_class<T>::value == 0>::type fill(T &t, const V &v) {
    t = v;
}
template<class T, class V>
typename enable_if<is_class<T>::value != 0>::type fill(T &t, const V &v){
    for (auto &e : t) fill(e, v);
}

#define COUT(x) cout << #x << " = " << (x) << " (L" << __LINE__ << ")" << endl
template<class T1, class T2> ostream& operator << (ostream &s, pair<T1,T2> P)
{ return s << '<' << P.first << ", " << P.second << '>'; }
template<class T> ostream& operator << (ostream &s, vector<T> P)
{ for (int i = 0; i < P.size(); ++i) { if (i > 0) { s << " "; } s << P[i]; } return s; }
template<class T> ostream& operator << (ostream &s, vector<vector<T> > P)
{ for (int i = 0; i < P.size(); ++i) { s << endl << P[i]; } return s << endl; }

#define EACH(i, s) for (__typeof__((s).begin()) i = (s).begin(); i != (s).end(); ++i)
template<class T> ostream& operator << (ostream &s, set<T> P)
{ EACH(it, P) { s << "<" << *it << "> "; } return s << endl; }
template<class T1, class T2> ostream& operator << (ostream &s, map<T1,T2> P)
{ EACH(it, P) { s << "<" << it->first << "->" << it->second << "> "; } return s << endl; }

using pll = pair<long long, long long>;

int N;
vector<long long> A;

void solve() {
    long long mi = 1LL<<60, ma = -(1LL<<60);
    int mii = -1, mai = -1;
    for (int i = 0; i < N; ++i) {
        if (chmin(mi, A[i])) mii = i;
        if (chmax(ma, A[i])) mai = i;
    }

    int sei = -1, hu = -1;
    vector<int> sign(N);
    if (mi >= 0) {
        for (int i = 0; i < N; ++i) {
            if (i != mii) sign[i] = 1, sei = i;
            else sign[i] = -1, hu = i;
        }
    }
    else if (ma <= 0) {
        for (int i = 0; i < N; ++i) {
            if (i != mai) sign[i] = -1, hu = i;
            else sign[i] = 1, sei = i;
        }
    }
    else {
        for (int i = 0; i < N; ++i) {
            if (A[i] >= 0) sign[i] = 1, sei = i;
            else sign[i] = -1, hu = i;
        }
    }
        
    swap(A[N-1], A[sei]);
    swap(A[N-2], A[hu]);
    swap(sign[N-1], sign[sei]);
    swap(sign[N-2], sign[hu]);
    vector<long long> B(N);
    for (int i = 0; i < N; ++i) {
        if (sign[i] == 1) B[i] = A[i];
        else B[i] = -A[i];
    }

    vector<long long> S(N+1, 0);
    for (int i = 0; i < N; ++i) S[i+1] = S[i] + B[i];

    //COUT(A);
    //COUT(sign);

    
    cout << S[N] << endl;

    int con = 0;
    vector<pll> res;
    for (int i = 0; i < N-1; ++i) {
        if (con % 2 == 0) {
            if (sign[i] == 1) res.push_back(pll(A[i], -S[N]+S[i+1])), ++con;
            else res.push_back(pll(S[N]-S[i+1], A[i]));
        }
        else {
            if (sign[i] == -1) res.push_back(pll(A[i], S[N]-S[i+1])), ++con;
            else res.push_back(pll(-S[N]+S[i+1], A[i]));
        }
    }
    reverse(res.begin(), res.end());
    
    for (auto p : res) cout << p.first << " " << p.second << endl;
}

int main() {
    while (cin >> N) {
        A.resize(N);
        for (int i = 0; i < N; ++i) cin >> A[i];
        solve();
    }
}















Measured memory_bytes: 6384