import std.algorithm, std.container, std.conv, std.math, std.range, std.typecons, std.stdio, std.string;

auto rdsp(){return readln.splitter;}
void pick(R,T)(ref R r,ref T t){t=r.front.to!T;r.popFront;}
void readV(T...)(ref T t){auto r=rdsp;foreach(ref v;t)pick(r,v);}
void readA(T)(size_t n,ref T[]t){t=new T[](n);auto r=rdsp;foreach(ref v;t)pick(r,v);}

void main()
{
  int x, y, z, k; readV(x, y, z, k);
  long[] a; readA(x, a);
  long[] b; readA(y, b);
  long[] c; readA(z, c);

  long[] d;
  foreach (ai; a)
    foreach (bi; b)
      d ~= ai+bi;

  d.sort!"a>b";
  d = d[0..min(d.length, k)];

  long[] e;
  foreach (ci; c)
    foreach (di; d)
      e ~= ci+di;

  e.sort!"a>b";

  foreach (i; 0..k)
    writeln(e[i]);
}
