#include<bits/stdc++.h>
using namespace std;
//type
typedef long long ll;
using pii = pair<int, int>;
//constant
#define inf (int)(1e9+7)
#define mod (ll)(1e9+7)
#define eps 1e-10
int dy[] = {0, 0, -1, 1, -1, 1, -1, 1};
int dx[] = {1, -1, 0, 0, -1, 1, 1, -1};
//omission
#define eb emplace_back
#define F first
#define S second
#define SZ(x) ((int)(x).size())
//manip
template<class T> bool chmax(T &a, T &b) {if (a < b) {a = b; return 1;} return 0;}
template<class T> bool chmin(T &a, T &b) {if (a > b) {a = b; return 1;} return 0;}
#define UNIQUE(v) v.erase(unique(v.begin(), v.end(), v.end());
#define fill(x, y) memset(x, y, sizeof(x))
#define ceil(a, b) a / b + !!(a % b)
template<class T> T power(T a, T b)
{return b ? power(a * a % inf, b / 2) * (b % 2 ? a : 1) % inf : 1;}
#define LB(v, x) (int)(lower_bound(v.begin(), v.end(), x) - v.begin())
#define out(v) rep(i, SZ(v)) cout << v[i] << endl
#define outp(v) rep(i, SZ(v)) cout << v[i].F << " " << v[i].S << endl
//loop
#define rep(i, n) for (int i = 0, i##_len = (n); i < i##_len; ++i)
#define rrep(i, st, n) for (int i = st; i < n; ++i)
#define brep(i, n) for (int i = n - 1; i >= 0; --i)

/*
 1. 差分を考える
 (x - y) - (x + y) = -2y
 黒板に加えるのがなければ負の数で絶対値の大きいのをyとして採用していったらいい
 
 加える操作あってもいけるか？
 できたのを二分探索でしかるとこに入れたらいけるかも
 
 残念ながらほしい負の数ないcase
 if 正の数のみ
 結局小さい数からyとして引こう
 
 それだとsample1でng
 
 正の数ででかいのを常に作ろうとしてしまう
 
 最後に正の絶対値大きいの作れなあかん
 負の数で絶対値大きいのつくっても最後それ引いたらでっかくなる
 
 
 2. 負の数で絶対値大きいのを構成してみよう
 正の数1つとっておく
 x - yのxにする
 yは、負の数引き続けたのの和
 　
 じゃあ、あとの正の数どうするか
 上の考え方から、正の数引き続けたのの和を引けばいい
 
 何から引くか
 1つ負の数とっておく(結局上と双対みたいな)
 
 
 ------別のありうる考え方-----
 
 3. 簡単のため正の数のみを考える
 x - y
 yの先頭は必ず正
 よって負の符号のものが必ず1つでる
 残り全て正にできるか
 
 1 - (2 - 3 - 4 - 5 - ...)
 みたいな
 
 
 4. 実験してみる
 a, b, c, d, e
 (a - b)
 c - (a - b)
 d - (c - (a - b))
 (d - (c - (a - b)) - e
 = a - b - c + d - e
 
 符号を好きにできる？
 
 */
int main() {
    //cast caution
    //look constraints always
    /*
    黒板の最大数
    10^4 - (-10^4) - (-10^4) - ... = 10^4 + 10^4 * (10^5 - 1) = 10^9
     */
    cin.tie(0); ios::sync_with_stdio(false);
    int n; cin >> n;
    vector<int> v;
    rep(i, n) {int tmp; cin >> tmp; v.eb(tmp);}
    sort(v.begin(), v.end());
    //2. のcode
    int y = v[0], x = v[SZ(v) - 1];
    vector<pii> ans;
    rrep(i, 1, n - 1) {
        if (v[i] < 0) {
            ans.eb(x, v[i]);
            x -= v[i];
        } else {
            ans.eb(y, v[i]);
            y -= v[i];
        }
    }
    ans.eb(x, y);
    cout << x - y << endl;
    outp(ans);
    
    
    
    
    
    
    
    
    
    /*  ng code 1. -2y y minus large
    int n; cin >> n;
    vector<int> v;
    rep(i, n) {int tmp; cin >> tmp; v.eb(tmp);}
    sort(v.begin(), v.end());
    rep(i, n - 1) {
        int x = v[v.size() - 1];
        int y = v[0];
        //cout << x << " " << y << endl;
        v.erase(v.begin());
        v.erase(v.end() - 1);
        int it = LB(v, x - y);
        v.insert(v.begin() + it, x - y);
        rep(j, SZ(v)) cout << v[j] << " "; cout << endl;
    }
    cout << v[0] << endl;
     */
}

/*
 sample1で4は２通り作り方ある
 sampleのと、
 -1 - 2 = -3
 1 - (-3) = 4
 
 なぜ最大の数2通り作れたか
 やってるのが、
 正 - ((唯一の負) - 正)
 
 正は可換
 てか、これが正しい考え方示してる
 あとは負を後ろに引いていくだけ
 
 
 */


Measured memory_bytes: 3188