using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace d
{
    //https://github.com/ufcpp/UfcppSample/blob/master/Chapters/Algorithm/Collections/PriorityQueue.cs

    /// <summary>
    /// 優先度付き待ち行列
    /// </summary>
    /// <typeparam name="T">要素の型</typeparam>
    class PriorityQueue<T>
      where T : IComparable<T>
    {
        #region フィールド

        List<T> buffer;

        #endregion
        #region 初期化

        public PriorityQueue() { this.buffer = new List<T>(); }
        public PriorityQueue(int capacity) { this.buffer = new List<T>(capacity); }

        #endregion
        #region ヒープ操作

        /// <summary>
        /// ヒープ化されている配列リストに新しい要素を追加する。
        /// </summary>
        /// <param name="array">対象の配列リスト</param>
        static void PushHeap(List<T> array, T elem)
        {
            int n = array.Count;
            array.Add(elem);

            while (n != 0)
            {
                int i = (n - 1) / 2;
                if (array[n].CompareTo(array[i]) > 0)
                {
                    T tmp = array[n]; array[n] = array[i]; array[i] = tmp;
                }
                n = i;
            }
        }

        /// <summary>
        /// ヒープから最大値を削除する。
        /// </summary>
        /// <param name="array">対象の配列リスト</param>
        static void PopHeap(List<T> array)
        {
            int n = array.Count - 1;
            array[0] = array[n];
            array.RemoveAt(array.Count - 1);

            for (int i = 0, j; (j = 2 * i + 1) < n;)
            {
                if ((j != n - 1) && (array[j].CompareTo(array[j + 1]) < 0))
                    j++;
                if (array[i].CompareTo(array[j]) < 0)
                {
                    T tmp = array[j]; array[j] = array[i]; array[i] = tmp;
                }
                i = j;
            }
        }

        #endregion
        #region 要素の挿入・削除

        /// <summary>
        /// 要素のプッシュ。
        /// </summary>
        /// <param name="elem">挿入したい要素</param>
        public void Push(T elem)
        {
            PushHeap(this.buffer, elem);
        }

        /// <summary>
        /// 要素を1つポップ。
        /// </summary>
        /// <remarks>
        /// 今回の実装では、先頭要素の読み出しと削除は別に行う。
        /// この Pop では削除のみ。
        /// 読み出しには Top プロパティを使う。
        /// </remarks>
        public void Pop()
        {
            PopHeap(this.buffer);
        }

        /// <summary>
        /// 先頭要素の読み出し。
        /// </summary>
        public T Top
        {
            get { return this.buffer[0]; }
        }

        public int Count
        {
            get { return this.buffer.Count; }
        }

        #endregion
    }

    class Combi : IComparable<Combi>
    {
        public int a, b, c;
        public long s;

        public Combi(int a, int b, int c, long s)
        {
            this.a = a;
            this.b = b;
            this.c = c;
            this.s = s;
        }

        public int CompareTo(Combi r)
        {
            if (this.s == r.s)
                return 0;
            if (this.s < r.s)
                return -1;
            else
                return 1;
        }

        public override bool Equals(object obj)
        {
            Combi r = (Combi)obj;
            return this.a == r.a && this.b == r.b && this.c == r.c;
        }

        public override int GetHashCode()
        {
            return Tuple.Create(this.a, this.b, this.c).GetHashCode(); 
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var s = Console.ReadLine().Split(' ').ToList().ConvertAll(i => long.Parse(i));
            var x = s[0];
            var y = s[1];
            var z = s[2];
            var k = s[3];
            
            var a = Console.ReadLine().Split(' ').ToList().ConvertAll(i => long.Parse(i));
            var b = Console.ReadLine().Split(' ').ToList().ConvertAll(i => long.Parse(i));
            var c = Console.ReadLine().Split(' ').ToList().ConvertAll(i => long.Parse(i));

            a = a.OrderBy(i => -i).ToList();
            b = b.OrderBy(i => -i).ToList();
            c = c.OrderBy(i => -i).ToList();

            PriorityQueue<Combi> queue = new PriorityQueue<Combi>();

            queue.Push(new Combi(0, 0, 0, a[0] + b[0] + c[0]));

            int output = 0;
            HashSet<Combi> already = new HashSet<Combi>();
            while (output < k)
            {
                while (already.Contains(queue.Top))
                {
                    queue.Pop();
                }
                Combi combi = queue.Top;
                queue.Pop();
                already.Add(combi);

                Console.WriteLine(combi.s);
                output++;

                if (combi.a + 1 < x)
                {
                    queue.Push(new Combi(combi.a + 1, combi.b, combi.c, a[combi.a + 1] + b[combi.b] + c[combi.c]));
                }
                if (combi.b + 1 < y)
                {
                    queue.Push(new Combi(combi.a, combi.b + 1, combi.c, a[combi.a] + b[combi.b + 1] + c[combi.c]));
                }
                if (combi.c + 1 < x)
                {
                    queue.Push(new Combi(combi.a, combi.b, combi.c + 1, a[combi.a] + b[combi.b] + c[combi.c + 1]));
                }
            }
        }
    }
}


Measured memory_bytes: 14432