import sys

#import numpy as np



s2nn = lambda s: [int(c) for c in s.split(' ')]

ss2nn = lambda ss: [int(s) for s in ss]

ss2nnn = lambda ss: [s2nn(s) for s in ss]

i2s = lambda: sys.stdin.readline().rstrip()

i2n = lambda: int(i2s())

i2nn = lambda: s2nn(i2s())

ii2ss = lambda n: [sys.stdin.readline().rstrip() for _ in range(n)]

ii2nn = lambda n: ss2nn(ii2ss(n))

ii2nnn = lambda n: ss2nnn(ii2ss(n))



N = 10000

def tokey(i, j, k):

    return i*N*N + j*N + k

def dekey(n):

    i = int(n / N / N)

    j = int(n / N) % N

    k = n % N

    return i, j, k



def main():

    X, Y, Z, K = i2nn()

    A = i2nn()

    B = i2nn()

    C = i2nn()

    A.sort()

    A.reverse()

    B.sort()

    B.reverse()

    C.sort()

    C.reverse()

    Q = [(A[0] + B[0] + C[0], 0, 0, 0)]

    loop = 0

    stored = set()

    def next(i, j, k):

        if i >= X or j >= Y or k >= Z:

            return

        key = tokey(i, j, k)

        if key not in stored:

            stored.add(key)

            n = A[i] + B[j] + C[k]

            Q.append((n, i, j, k))

    while True:

        v = max(Q, key=lambda v: v[0])

        Q.remove(v)

        print((v[0]))

        loop += 1

        if loop >= K:

            break

        next(v[1]+1, v[2], v[3])

        next(v[1], v[2]+1, v[3])

        next(v[1], v[2], v[3]+1)



main()

import sys

from collections import deque  # 双方向キュー

from collections import defaultdict  # 初期化済み辞書

from heapq import heapify, heappush, heappop, heappushpop  # プライオリティキュー

from bisect import bisect_left, bisect_right  # 二分探索

#import numpy as np  # 1.8.2

#import scipy  # 0.13.3

#sys.setrecursionlimit(int(1e+6))

s2nn = lambda s: [int(c) for c in s.split(' ')]

ss2nn = lambda ss: [int(s) for s in ss]

ss2nnn = lambda ss: [s2nn(s) for s in ss]

i2s = lambda: sys.stdin.readline().rstrip()

i2n = lambda: int(i2s())

i2nn = lambda: s2nn(i2s())

ii2ss = lambda n: [sys.stdin.readline().rstrip() for _ in range(n)]

ii2sss = lambda n: [list(sys.stdin.readline().rstrip()) for _ in range(n)]

ii2nn = lambda n: ss2nn(ii2ss(n))

ii2nnn = lambda n: ss2nnn(ii2ss(n))

MOD = int(1e+9) + 7



def main():

    X, Y, Z, K = i2nn()

    A = i2nn()

    B = i2nn()

    C = i2nn()

    A.sort()

    A.reverse()

    B.sort()

    B.reverse()

    C.sort()

    C.reverse()

    s = set()

    hq = []

    n = 0

    heappush(hq, ((A[0] + B[0] + C[0]) * -1, (0, 0, 0)))

    while n < K:

        t, abc = heappop(hq)

        if abc in s:

            continue

        s.add(abc)

        (a, b, c) = abc

        if a+1 < X:

            heappush(hq, ((A[a+1] + B[b] + C[c]) * -1, (a+1, b, c)))

        if b+1 < Y:

            heappush(hq, ((A[a] + B[b+1] + C[c]) * -1, (a, b+1, c)))

        if c+1 < Z:

            heappush(hq, ((A[a] + B[b] + C[c+1]) * -1, (a, b, c+1)))

        print((-t))

        n += 1



main()

import sys

# import numpy as np
s2nn = lambda s: [int(c) for c in s.split(" ")]
ss2nn = lambda ss: [int(s) for s in ss]
ss2nnn = lambda ss: [s2nn(s) for s in ss]
i2s = lambda: sys.stdin.readline().rstrip()
i2n = lambda: int(i2s())
i2nn = lambda: s2nn(i2s())
ii2ss = lambda n: [sys.stdin.readline().rstrip() for _ in range(n)]
ii2nn = lambda n: ss2nn(ii2ss(n))
ii2nnn = lambda n: ss2nnn(ii2ss(n))
N = 10000


def tokey(i, j, k):
    return i * N * N + j * N + k


def dekey(n):
    i = int(n / N / N)
    j = int(n / N) % N
    k = n % N
    return i, j, k


def main():
    X, Y, Z, K = i2nn()
    A = i2nn()
    B = i2nn()
    C = i2nn()
    A.sort()
    A.reverse()
    B.sort()
    B.reverse()
    C.sort()
    C.reverse()
    Q = [(A[0] + B[0] + C[0], 0, 0, 0)]
    loop = 0
    stored = set()

    def next(i, j, k):
        if i >= X or j >= Y or k >= Z:
            return
        key = tokey(i, j, k)
        if key not in stored:
            stored.add(key)
            n = A[i] + B[j] + C[k]
            Q.append((n, i, j, k))

    while True:
        v = max(Q, key=lambda v: v[0])
        Q.remove(v)
        print((v[0]))
        loop += 1
        if loop >= K:
            break
        next(v[1] + 1, v[2], v[3])
        next(v[1], v[2] + 1, v[3])
        next(v[1], v[2], v[3] + 1)


main()

import sys
from collections import deque  # 双方向キュー
from collections import defaultdict  # 初期化済み辞書
from heapq import heapify, heappush, heappop, heappushpop  # プライオリティキュー
from bisect import bisect_left, bisect_right  # 二分探索

# import numpy as np  # 1.8.2
# import scipy  # 0.13.3
# sys.setrecursionlimit(int(1e+6))
s2nn = lambda s: [int(c) for c in s.split(" ")]
ss2nn = lambda ss: [int(s) for s in ss]
ss2nnn = lambda ss: [s2nn(s) for s in ss]
i2s = lambda: sys.stdin.readline().rstrip()
i2n = lambda: int(i2s())
i2nn = lambda: s2nn(i2s())
ii2ss = lambda n: [sys.stdin.readline().rstrip() for _ in range(n)]
ii2sss = lambda n: [list(sys.stdin.readline().rstrip()) for _ in range(n)]
ii2nn = lambda n: ss2nn(ii2ss(n))
ii2nnn = lambda n: ss2nnn(ii2ss(n))
MOD = int(1e9) + 7


def main():
    X, Y, Z, K = i2nn()
    A = i2nn()
    B = i2nn()
    C = i2nn()
    A.sort()
    A.reverse()
    B.sort()
    B.reverse()
    C.sort()
    C.reverse()
    s = set()
    hq = []
    n = 0
    heappush(hq, ((A[0] + B[0] + C[0]) * -1, (0, 0, 0)))
    while n < K:
        t, abc = heappop(hq)
        if abc in s:
            continue
        s.add(abc)
        (a, b, c) = abc
        if a + 1 < X:
            heappush(hq, ((A[a + 1] + B[b] + C[c]) * -1, (a + 1, b, c)))
        if b + 1 < Y:
            heappush(hq, ((A[a] + B[b + 1] + C[c]) * -1, (a, b + 1, c)))
        if c + 1 < Z:
            heappush(hq, ((A[a] + B[b] + C[c + 1]) * -1, (a, b, c + 1)))
        print((-t))
        n += 1


main()

+from collections import deque  # 双方向キュー +from collections import defaultdict  # 初期化済み辞書 +from heapq import heapify, heappush, heappop, heappushpop  # プライオリティキュー +from bisect import bisect_left, bisect_right  # 二分探索 -# import numpy as np +# import numpy as np  # 1.8.2 +# import scipy  # 0.13.3 +# sys.setrecursionlimit(int(1e+6)) +ii2sss = lambda n: [list(sys.stdin.readline().rstrip()) for _ in range(n)] -N = 10000 - - -def tokey(i, j, k): -    return i * N * N + j * N + k - - -def dekey(n): -    i = int(n / N / N) -    j = int(n / N) % N -    k = n % N -    return i, j, k +MOD = int(1e9) + 7 -    Q = [(A[0] + B[0] + C[0], 0, 0, 0)] -    loop = 0 -    stored = set() - -    def next(i, j, k): -        if i >= X or j >= Y or k >= Z: -            return -        key = tokey(i, j, k) -        if key not in stored: -            stored.add(key) -            n = A[i] + B[j] + C[k] -            Q.append((n, i, j, k)) - -    while True: -        v = max(Q, key=lambda v: v[0]) -        Q.remove(v) -        print((v[0])) -        loop += 1 -        if loop >= K: -            break -        next(v[1] + 1, v[2], v[3]) -        next(v[1], v[2] + 1, v[3]) -        next(v[1], v[2], v[3] + 1) +    s = set() +    hq = [] +    n = 0 +    heappush(hq, ((A[0] + B[0] + C[0]) * -1, (0, 0, 0))) +    while n < K: +        t, abc = heappop(hq) +        if abc in s: +            continue +        s.add(abc) +        (a, b, c) = abc +        if a + 1 < X: +            heappush(hq, ((A[a + 1] + B[b] + C[c]) * -1, (a + 1, b, c))) +        if b + 1 < Y: +            heappush(hq, ((A[a] + B[b + 1] + C[c]) * -1, (a, b + 1, c))) +        if c + 1 < Z: +            heappush(hq, ((A[a] + B[b] + C[c + 1]) * -1, (a, b, c + 1))) +        print((-t)) +        n += 1