#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
using namespace std;
typedef tree<pair<int,int>, null_type, less<pair<int,int>>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
#define int long long
#define ld long double
#define fi first
#define se second
#define pb push_back
#define pii pair<int,int>
#define all(x) (x).begin(), (x).end()
#define forn(i,n) for(int i=0;i<(int)(n);i++)
#define for1(i,n) for(int i=1;i<=(int)(n);i++)
const int MOD = 1e9 + 7 ;
int mpow(int a,int b,int p=MOD){a=a%p;int res=1;while(b>0){if(b&1)res=(res*a)%p;a=(a*a)%p;b=b>>1;}return res%p;}
const int N=400002;
bool cmp(int x,int y)
{
      return x>y;
}
int32_t main(){
      ios_base::sync_with_stdio(false);
      cin.tie(NULL);

      int n;
      cin>>n;
      int a[n];
      bool f1=false,f2=false;
      for(int i=0;i<n;i++) cin>>a[i];
      sort(a,a+n);
      for(int i=0;i<n;i++) if(a[i]<0) f1=true; else f2=true;
      if(f1&&f2)
      {
            vector<int> neg;
            vector<int> pos;
            int sum=0;
            for(int i=0;i<n;i++)
            {
                  if(a[i]>=0) pos.pb(a[i]);
                  else neg.pb(a[i]);
                  sum+=abs(a[i]);
            }
            vector<pii> ans;
            int o=neg.back();
            neg.pop_back();
            for(int i=0;i<(int)pos.size()-1;i++)
            {
                  ans.pb({o,pos[i]});
                  o=o-pos[i];
            }
            ans.pb({pos[(int)pos.size()-1],o});
            o=pos[(int)pos.size()-1]-o;
            for(int i=0;i<neg.size();i++)
            {
                  ans.pb({o,neg[i]});
                  o-=neg[i];
            }
            cout<<o<<"\n";
            for(auto x:ans) cout<<x.fi<<" "<<x.se<<"\n";
      }
      else{
            if(f1)
            {
                  sort(a,a+n,cmp);
                  int o=a[0];
                  vector<pii> ans;
                  // if(n==2)
                  // {
                  //       ans.pb({a[1],o});
                  //       o=a[1]-o;
                  // }
                  // else{
                        ans.pb({o,a[1]});
                        o-=a[1];
                        for(int i=2;i<n;i++)
                        {
                              ans.pb({o,a[i]});
                              o-=a[i];
                        }
                  // }
                  cout<<o<<"\n";
                  for(auto x:ans) cout<<x.fi<<" "<<x.se<<"\n";
            }
            else{
                  int o=a[0];
                  vector<pii> ans;
                  if(n==2)
                  {
                        ans.pb({a[1],o});
                        o=a[1]-o;
                  }
                  else{
                        ans.pb({o,a[1]});
                        o-=a[1];
                        for(int i=2;i<n-1;i++)
                        {
                              ans.pb({o,a[i]});
                              o-=a[i];
                        }
                        ans.pb({a[n-1],o});
                        o=a[n-1]-o;
                  }
                  cout<<o<<"\n";
                  for(auto x:ans) cout<<x.fi<<" "<<x.se<<"\n";     
            }
      }
}
// I never lose. I either win or I learn

Measured memory_bytes: 5872