using System;
using System.Collections.Generic;
using System.Linq;



namespace CSharpSample01
{

    struct ABC
    {
        public long val;
        public int i;
        public int j;
        public int k;
    }

    class PriorityQueue_ABC
    {
        int H;
        //高速に要素にアクセスするためにリストでなく配列
        ABC[] heap;
        const int MAX = 2000000;

        public PriorityQueue_ABC()
        {
            H = 0;
            heap = new ABC[MAX];
        }

        public PriorityQueue_ABC(int size)
        {
            H = size;
            heap = new ABC[H + 1];
        }

        //上のuから下までずーと(入れ替えられなくなるor限界Hまで)
        public void MaxHeapfy(int p)
        {
            while (2 * p <= H)
            {
                int son_n = 2 * p;
                ABC son = heap[2 * p];

                if (2 * p + 1 <= H && son.val < heap[2 * p + 1].val)
                {
                    son = heap[2 * p + 1];
                    son_n++;
                }

                if (son.val > heap[p].val)
                {
                    ABC tmp = heap[p];
                    heap[p] = son;
                    heap[son_n] = tmp;
                }
                else
                {
                    break;
                }

                p = son_n;
            }
        }

        public void BuildMaxHeap()
        {
            for (int s = H / 2; s >= 1; s--)
            {
                MaxHeapfy(s);
            }
        }

        public void Enqueue(ABC key)
        {
            //下から上にずーとヒープ
            H++;
            heap[H] = key;

            int son = H;

            while (son != 1)
            {
                int p = son / 2;
                if (heap[son].val > heap[p].val)
                {
                    ABC tmp = heap[p];
                    heap[p] = heap[son];
                    heap[son] = tmp;
                    son /= 2;
                }
                else
                {
                    break;
                }
            }

        }

        public ABC Dequeue()
        {
            if (H == 0) Console.WriteLine("要素がありません");
            ABC max = heap[1];         
            heap[1] = heap[H];
            H--;

            MaxHeapfy(1);

            return max;
        }

        

    }





    class Program
    {

        static void Solve(long[] A, long[] B, long[] C, int K)
        {
            PriorityQueue_ABC pq = new PriorityQueue_ABC();
            Dictionary<ABC, bool> dic = new Dictionary<ABC, bool>();
            long[] ans = new long[K];
            ABC abc = new ABC() { val = A[0] + B[0] + C[0], i = 0, j = 0, k = 0 };
            pq.Enqueue(abc);
            dic[abc] = true;
            

            for(int s = 0; s < K; s++)
            {
                abc = pq.Dequeue();
                ans[s] = abc.val;
                int a = abc.i;
                int b = abc.j;
                int c = abc.k;

                if(a + 1 < A.Length) abc = new ABC() { val = A[a + 1] + B[b] + C[c], i = a + 1, j = b, k = c };
                if (!dic.ContainsKey(abc))
                {
                    dic[abc] = true;
                    pq.Enqueue(abc);
                }
                if(b + 1 < B.Length) abc = new ABC() { val = A[a] + B[b + 1] + C[c], i = a, j = b + 1, k = c };
                if (!dic.ContainsKey(abc))
                {
                    dic[abc] = true;
                    pq.Enqueue(abc);
                }
                if(c + 1 < C.Length) abc = new ABC() { val = A[a] + B[b] + C[c + 1], i = a, j = b, k = c + 1 };
                if (!dic.ContainsKey(abc))
                {
                    dic[abc] = true;
                    pq.Enqueue(abc);
                }
                
            }

            for(int s = 0; s < K; s++)
            {
                Console.WriteLine(ans[s]);
            }
            
        }

        static void Main(string[] args)
        {
            string[] input = Console.ReadLine().Split(' ');
            int X = int.Parse(input[0]);
            int Y = int.Parse(input[1]);
            int Z = int.Parse(input[2]);
            int K = int.Parse(input[3]);

            long[] A = Console.ReadLine().Split(' ').Select(x => long.Parse(x)).ToArray();
            long[] B = Console.ReadLine().Split(' ').Select(x => long.Parse(x)).ToArray();
            long[] C = Console.ReadLine().Split(' ').Select(x => long.Parse(x)).ToArray();

            A = A.OrderByDescending(x => x).ToArray();
            B = B.OrderByDescending(x => x).ToArray();
            C = C.OrderByDescending(x => x).ToArray();

            Solve(A, B, C, K);

        }
    }

}

Measured memory_bytes: 18776