def c_successive_subtraction(N, A):
    A.sort()
    maximum = A.pop()
    minimum = A.pop(0)

    # Aの要素のうち、最大のものと最小のものを分けて置いておく。
    # それら以外の要素 a_k について、
    # a_k が非負なら、最小のものから a_k を引くことで負の方向に大きくできる。
    # a_k が負なら、最大のものから a_k を引くことで正の方向に大きくできる。
    # 最後に 最大のもの - 最小のもの とすると、最後に残る整数を最大にできる。
    operation = []
    for a in A:
        if a >= 0:
            operation.append('{} {}'.format(minimum, a))
            minimum -= a
        else:
            operation.append('{} {}'.format(maximum, a))
            maximum -= a
    operation.append('{} {}'.format(maximum, minimum))
    return str(maximum - minimum) + '\n' + '\n'.join(operation)

N = int(input())
A = [int(i) for i in input().split()]
print(c_successive_subtraction(N, A)) def c_successive_subtraction(N, A):
    A.sort()
    maximum = A.pop()
    minimum = A.pop(0)

    # Aの要素のうち、最大のものと最小のものを分けて置いておく。
    # それら以外の要素 a_k について、
    # a_k が非負なら、最小のものから a_k を引くことで負の方向に大きくできる。
    # a_k が負なら、最大のものから a_k を引くことで正の方向に大きくできる。
    # 最後に 最大のもの - 最小のもの とすると、最後に残る整数を最大にできる。
    operation = []
    for a in A:
        if a >= 0:
            operation.append('{} {}'.format(minimum, a))
            minimum -= a
        else:
            operation.append('{} {}'.format(maximum, a))
            maximum -= a
    operation.append('{} {}'.format(maximum, minimum))
    return str(maximum - minimum) + '\n' + '\n'.join(operation) c_successive_subtraction A.sort() A.sort A sort maximum = A.pop() maximum A.pop() A.pop A pop minimum = A.pop(0) minimum A.pop(0) A.pop A pop 0 operation = [] operation [] for a in A:
        if a >= 0:
            operation.append('{} {}'.format(minimum, a))
            minimum -= a
        else:
            operation.append('{} {}'.format(maximum, a))
            maximum -= a
     a A if a >= 0:
            operation.append('{} {}'.format(minimum, a))
            minimum -= a
        else:
            operation.append('{} {}'.format(maximum, a))
            maximum -= a
     a >= 0 a 0 operation.append('{} {}'.format(minimum, a)) operation.append operation append '{} {}'.format(minimum, a) '{} {}'.format '{} {}' format minimum a minimum -= a minimum a operation.append('{} {}'.format(maximum, a)) operation.append operation append '{} {}'.format(maximum, a) '{} {}'.format '{} {}' format maximum a maximum -= a maximum a operation.append('{} {}'.format(maximum, minimum)) operation.append operation append '{} {}'.format(maximum, minimum) '{} {}'.format '{} {}' format maximum minimum return str(maximum - minimum) + '\n' + '\n'.join(operation) str(maximum - minimum) + '\n' + '\n'.join(operation) str(maximum - minimum) + '\n' str(maximum - minimum) str maximum - minimum maximum minimum '\n' '\n'.join(operation) '\n'.join '\n' join operation N N A A N = int(input()) N int(input()) int input() input int(i) for i in input().split() for i in input().split() i input().split() ().split () input split for i in input().split() int(i) int i A = [int(i) for i in input().split()] A [int(i) for i in input().split()] print(c_successive_subtraction(N, A)) print c_successive_subtraction(N, A) c_successive_subtraction N A A = [int(i) for i in input().split()] [int(i) for i in input().split()] A def c_successive_subtraction(N, A):
    A.sort()
    maximum = A.pop()
    minimum = A.pop(0)

    # Aの要素のうち、最大のものと最小のものを分けて置いておく。
    # それら以外の要素 a_k について、
    # a_k が非負なら、最小のものから a_k を引くことで負の方向に大きくできる。
    # a_k が負なら、最大のものから a_k を引くことで正の方向に大きくできる。
    # 最後に 最大のもの - 最小のもの とすると、最後に残る整数を最大にできる。
    operation = []
    for a in A:
        if a >= 0:
            operation.append('{} {}'.format(minimum, a))
            minimum -= a
        else:
            operation.append('{} {}'.format(maximum, a))
            maximum -= a
    operation.append('{} {}'.format(maximum, minimum))
    return str(maximum - minimum) + '\n' + '\n'.join(operation) def c_successive_subtraction(N, A):
    A.sort()
    maximum = A.pop()
    minimum = A.pop(0)

    # Aの要素のうち、最大のものと最小のものを分けて置いておく。
    # それら以外の要素 a_k について、
    # a_k が非負なら、最小のものから a_k を引くことで負の方向に大きくできる。
    # a_k が負なら、最大のものから a_k を引くことで正の方向に大きくできる。
    # 最後に 最大のもの - 最小のもの とすると、最後に残る整数を最大にできる。
    operation = []
    for a in A:
        if a >= 0:
            operation.append('{} {}'.format(minimum, a))
            minimum -= a
        else:
            operation.append('{} {}'.format(maximum, a))
            maximum -= a
    operation.append('{} {}'.format(maximum, minimum))
    return str(maximum - minimum) + '\n' + '\n'.join(operation) c_successive_subtraction N = int(input()) int(input()) N
def c_successive_subtraction(N, A):
    A.sort()
    maximum = A.pop()
    minimum = A.pop(0)

    # Aの要素のうち、最大のものと最小のものを分けて置いておく。
    # それら以外の要素 a_k について、
    # a_k が非負なら、最小のものから a_k を引くことで負の方向に大きくできる。
    # a_k が負なら、最大のものから a_k を引くことで正の方向に大きくできる。
    # 最後に 最大のもの - 最小のもの とすると、最後に残る整数を最大にできる。
    operation = []
    for a in A:
        if a >= 0:
            operation.append('{} {}'.format(minimum, a))
            minimum -= a
        else:
            operation.append('{} {}'.format(maximum, a))
            maximum -= a
    operation.append('{} {}'.format(maximum, minimum))
    return str(maximum - minimum) + '\n' + '\n'.join(operation)

N = int(input())
A = [int(i) for i in input().split()]
print(c_successive_subtraction(N, A))