import java.util.Scanner

object Main {
  def main(args: Array[String]) {
    val result = solve(new Scanner(System.in))
    if (result.length > 0) println(result)
  }

  def solve(in: String): String = solve(new Scanner(in))

  def solve(sc: Scanner): String = {
    val X = sc.nextInt
    val Y = sc.nextInt
    val Z = sc.nextInt
    val K = sc.nextInt
    val A = Array.fill(X)(sc.nextLong).sorted.reverse
    val B = Array.fill(X)(sc.nextLong).sorted.reverse
    val C = Array.fill(X)(sc.nextLong).sorted.reverse

    val Ad = A.map(a => A(0) - a)
    val Bd = B.map(a => B(0) - a)
    val Cd = C.map(a => C(0) - a)
    val max = (Ad ++ Bd ++ Cd).sorted.reverse.take(Math.sqrt(K).toInt + 2).last

    val AA = A.takeWhile(a => A(0) - a <= max)
    val BB = B.takeWhile(b => B(0) - b <= max)
    val CC = C.takeWhile(c => C(0) - c <= max)

//    println(AA.mkString(","))
//    println(BB.mkString(","))
//    println(CC.mkString(","))

    val r = for (a <- A.indices; b <- B.indices; c <- C.indices) yield A(a) + B(b) + C(c)
    r.sorted.reverse.take(K).mkString("\n")
  }
}
