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 Rust (1.15.1) (judge verdict: Accepted)

#![allow(unused_imports)]
#![allow(non_snake_case)]
use std::cmp::*;
use std::collections::*;
use std::io::Write;

#[allow(unused_macros)]
macro_rules! debug {
    ($($e:expr),*) => {
        #[cfg(debug_assertions)]
        $({
            let (e, mut err) = (stringify!($e), std::io::stderr());
            writeln!(err, "{} = {:?}", e, $e).unwrap()
        })*
    };
}

fn main() {
    let n = read::<usize>();
    let a = read_vec::<i64>();
    if *a.iter().min().unwrap() >= 0 || *a.iter().max().unwrap() <= 0 {
        let mut min_idx = 0;
        let mut min_elem = std::i64::MAX;
        for i in 0..n {
            if a[i].abs() < min_elem {
                min_idx = i;
                min_elem = a[i].abs();
            }
        }

        println!(
            "{}",
            a.iter().map(|x| x.abs()).sum::<i64>() - min_elem.abs() * 2
        );
        debug!(min_elem);

        let mut cur = a[min_idx];
        for i in 0..n - 1 {
            if i == min_idx {
                continue;
            }
            println!("{} {}", cur, a[i]);
            cur -= a[i];
        }
        if *a.iter().min().unwrap() >= 0 {
            println!("{} {}", a[n - 1], cur);
        } else {
            println!("{} {}", cur, a[n - 1]);
        }
        return;
    }
    // both sign exist.
    let mut plus_idxs = vec![];
    let mut minus_idxs = vec![];
    for i in 0..n {
        if a[i] > 0 {
            plus_idxs.push(i);
        } else {
            minus_idxs.push(i);
        }
    }

    println!("{}", a.iter().map(|x| x.abs()).sum::<i64>());
    // consume plus
    let mut cur1 = a[minus_idxs[0]];
    for i in 1..plus_idxs.len() {
        println!("{} {}", cur1, a[plus_idxs[i]]);
        cur1 -= a[plus_idxs[i]];
    }
    let mut cur2 = a[plus_idxs[0]];
    for i in 1..minus_idxs.len() {
        println!("{} {}", cur2, a[minus_idxs[i]]);
        cur2 -= a[minus_idxs[i]];
    }
    println!("{} {}", cur2, cur1);
}

fn read<T: std::str::FromStr>() -> T {
    let mut s = String::new();
    std::io::stdin().read_line(&mut s).ok();
    s.trim().parse().ok().unwrap()
}

fn read_vec<T: std::str::FromStr>() -> Vec<T> {
    read::<String>()
        .split_whitespace()
        .map(|e| e.parse().ok().unwrap())
        .collect()
}