#include <bits/stdc++.h>
#define fi first
#define se second
#define rep(i,n) for (ll i = 0; i < (n); ++i)
#define rep1(i,n) for (ll i = 1; i <= (n); ++i)
#define rrep(i,n) for (ll i = (n)-1; i >=0; --i)
#define ALL(a) a.begin(),a.end()
#define pb push_back
#define dame { puts("-1"); return 0;}
#define show(x) cerr<<#x<<" = "<<x<<endl;

using namespace std;
using ll = long long;
using ld = long double;
using pl = pair<ll, ll>;

typedef vector<ll> vl;
typedef vector<pl> vp;
template<class T> bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T> bool chmin(T &a, const T &b) { if (a>b) { a=b; return 1; } return 0; }


// auto mod int
// https://youtu.be/L8grWxBlIZ4?t=9858
// https://youtu.be/ERZuLAxZffQ?t=4807 : optimize
// https://youtu.be/8uowVvQ_-Mo?t=1329 : division
const ll mod = 1000000007;
struct mint {
  ll x; // typedef long long ll;
  mint(ll x=0):x((x%mod+mod)%mod){}
  mint operator-() const { return mint(-x);}
  mint& operator+=(const mint a) {
    if ((x += a.x) >= mod) x -= mod;
    return *this;
  }
  mint& operator-=(const mint a) {
    if ((x += mod-a.x) >= mod) x -= mod;
    return *this;
  }
  mint& operator*=(const mint a) { (x *= a.x) %= mod; return *this;}
  mint operator+(const mint a) const { return mint(*this) += a;}
  mint operator-(const mint a) const { return mint(*this) -= a;}
  mint operator*(const mint a) const { return mint(*this) *= a;}
  mint pow(ll t) const {
    if (!t) return 1;
    mint a = pow(t>>1);
    a *= a;
    if (t&1) a *= *this;
    return a;
  }

  // for prime mod
  mint inv() const { return pow(mod-2);}
  mint& operator/=(const mint a) { return *this *= a.inv();}
  mint operator/(const mint a) const { return mint(*this) /= a;}
};
istream& operator>>(istream& is, const mint& a) { return is >> a.x;}
ostream& operator<<(ostream& os, const mint& a) { return os << a.x;}
// combination mod prime
// https://www.youtube.com/watch?v=8uowVvQ_-Mo&feature=youtu.be&t=1619
struct combination {
  vector<mint> fact, ifact;
  combination(int n):fact(n+1),ifact(n+1) {
    assert(n < mod);
    fact[0] = 1;
    for (int i = 1; i <= n; ++i) fact[i] = fact[i-1]*i;
    ifact[n] = fact[n].inv();
    for (int i = n; i >= 1; --i) ifact[i-1] = ifact[i]*i;
  }
  mint operator()(int n, int k) {
    if (k < 0 || k > n) return 0;
    return fact[n]*ifact[k]*ifact[n-k];
  }
} c(200005);

// Sieve of Eratosthenes
// https://youtu.be/UTVg7wzMWQc?t=2774
struct Sieve {
  int n;
  vector<int> f, primes;
  Sieve(int n=1):n(n), f(n+1) {
    f[0] = f[1] = -1;
    for (ll i = 2; i <= n; ++i) {
      if (f[i]) continue;
      primes.push_back(i);
      f[i] = i;
      for (ll j = i*i; j <= n; j += i) {
        if (!f[j]) f[j] = i;
      }
    }
  }
  bool isPrime(int x) { return f[x] == x;}
  vector<int> factorList(int x) {
    vector<int> res;
    while (x != 1) {
      res.push_back(f[x]);
      x /= f[x];
    }
    return res;
  }
  vector<pl> factor(int x) {
    vector<int> fl = factorList(x);
    if (fl.size() == 0) return {};
    vector<pl> res(1, pl(fl[0], 0));
    for (int p : fl) {
      if (res.back().first == p) {
        res.back().second++;
      } else {
        res.emplace_back(p, 1);
      }
    }
    return res;
  }
  vector<pair<ll,int>> factor(ll x) {
    vector<pair<ll,int>> res;
    for (int p : primes) {
      int y = 0;
      while (x%p == 0) x /= p, ++y;
      if (y != 0) res.emplace_back(p,y);
    }
    if (x != 1) res.emplace_back(x,1);
    return res;
  }
};

using data = pair<ll, vector<ll> >;
ll LINF = 1000000000000000000;

int main() {
  ll x,y,z,k;
  cin >> x>>y>>z>>k;

  vector<ll> a(x);
  vector<ll> b(y);
  vector<ll> c(z);

  rep(i, x) cin >> a[i];
  rep(i, y) cin >> b[i];
  rep(i, z) cin >> c[i];

  sort(ALL(a));
  sort(ALL(b));
  sort(ALL(c));
  reverse(ALL(a));
  reverse(ALL(b));
  reverse(ALL(c));

  vector<ll> s;
  set<data> se;
  priority_queue<data> pq;
  pq.push(data(a[0]+b[0]+c[0], vector<ll>({0,0,0})));
  while(k>0){
    data tmp = pq.top();
    pq.pop();
    k--;

    cout << tmp.fi << endl;

    ll tmp_a = tmp.se[0];
    ll tmp_b = tmp.se[1];
    ll tmp_c = tmp.se[2];
    // show(tmp_a);
    // show(tmp_b);
    // show(tmp_c);
    if(tmp_a+1<x){
      tmp = data(a[tmp_a+1]+b[tmp_b]+c[tmp_c], vector<ll>({tmp_a+1,tmp_b,tmp_c})) ;
      if(!se.count(tmp )){
	se.insert(tmp );
	pq.push(tmp );
      }
    }
    if(tmp_b+1<y){
      tmp = data(a[tmp_a]+b[tmp_b+1]+c[tmp_c], vector<ll>({tmp_a,tmp_b+1,tmp_c})) ;
      if(!se.count(tmp )){
	se.insert(tmp );
	pq.push(tmp );
      }
    }
    if(tmp_c+1<z){
      tmp = data(a[tmp_a]+b[tmp_b]+c[tmp_c+1], vector<ll>({tmp_a,tmp_b,tmp_c+1})) ;
      if(!se.count(tmp )){
	se.insert(tmp );
	pq.push(tmp );
      }
    }

    
  }

  // sort(ALL(s));
  // reverse(ALL(s));
  
  //rep(i, s.size()) cout << s[i] << endl;
  
  return 0;
}


Measured memory_bytes: 4608