#include <iostream>
#include <map>
#include <vector>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <set>
#include <stack>
#include <queue>

using namespace std;
#define int long long
#define double long double
#define LINF ~(1LL<<63)
#define fst first
#define snd second
#define fr(s,n,i) for(int i=s;i<n;i++)
#define fr_(s,n,i) for(int i=s;i>=n;i--)
#define srt(v) sort(v.begin(), v.end());
#define rev(v) reverse(v.begin(), v.end());
#define upr(v, aim, ind) int ind; ind=(int)distance(v.begin(), upper_bound(v.begin(),v.end(), aim));
#define sz(v) (int)v.size()
#define ers(v, i) v.erase(v.begin() + i)
#define last(v) v[sz(v) - 1]
#define swp(v, i, j) int buf = v[j]; v[j] = v[i]; v[i] = buf;
#define shout(a) cout << a << endl;
#define dshout(a) printf("%.16Lf\n", a);
#define pr pair<int, int>
#define vi vector<int>
#define vp vector<pair<int, int>>
#define vd vector<double>
#define vdd vector<vd>
#define mx(a, b) a = max(a, b);
#define mn(a, b) a = min(a, b);
#define mulM(a,b,c) a = a * b % c;
#define squM(a,b) a = a * a % b;
#define mpr(a,b) make_pair(a,b);
#define iinp(a) int a; cin >> a;
#define sinp(a) string a; cin >> a;
#define dinp(a) double a; cin >> a;
#define ios() ios_base::sync_with_stdio(0);cin.tie(0);

int MOD = 1000000007;

int powM(int base, int exp){
    int ret = 1;
    int buf = base;
    while(exp > 0){
        if(exp & 1){
            ret *= buf;
        }
        squM(buf, MOD)
        exp >>= 1;
    }
    return ret;
}
int combM(int a, int b){
    if(b == 0){
        return 1;
    }
    if(a-b < b){
        return combM(a, a-b);
    }
    int ans = 1;
    fr(1,b+1,i){
        ans *= a + 1 - i;
        ans /= i;
    }
    return ans;
}
void solve();
signed main() {
    ios()
    solve();
    return 0;
}


vi as, bs, cs;

struct Pair{
  int a,b,c,umasa;
  Pair(int _a, int _b, int _c){
    a = _a; 
    b = _b; 
    c = _c; 
    umasa = as[a] + bs[b] + cs[c];
  }
  bool operator< (const Pair &another) const{
    return umasa < another.umasa;
  }
};

void solve(){
  int x,y,z,k;
  cin >> x >> y >> z >> k;
  fr(0,x,i){
    int aa;
    cin >> aa;
    as.emplace_back(aa);
  }
  fr(0,x,i){
    int aa;
    cin >> aa;
    bs.emplace_back(aa);
  }
  fr(0,x,i){
    int aa;
    cin >> aa;
    cs.emplace_back(aa);
  }
  srt(as);
  srt(bs);
  srt(cs);
  rev(as);
  rev(bs);
  rev(cs);
  priority_queue<Pair> q;
  map<string, bool> saw;
  q.push(Pair(0,0,0));
  int cnt = 0;
  vi umasa;
  while(!q.empty() && cnt < k){
    Pair buf = q.top();
    q.pop();
    int a  = buf.a;
    int b  = buf.b;
    int c  = buf.c;
    cnt++;
    umasa.emplace_back(buf.umasa);
    string s = to_string(a+1) + "_" + to_string(b) + "_" + to_string(c);
    if(!saw[s] && (a+1) < (int)as.size()){
      q.push(Pair(a+1,b,c));
      saw[s] = true;
    }
    s = to_string(a) + "_" + to_string(b+1) + "_" + to_string(c);
    if(!saw[s] && (b+1) < (int)bs.size()){
      q.push(Pair(a,b+1,c));
      saw[s] = true;
    }
    s = to_string(a) + "_" + to_string(b) + "_" + to_string(c+1);
    if(!saw[s] && (c+1) < (int)cs.size()){
      q.push(Pair(a,b,c+1));
      saw[s] = true;
    }
  }
  srt(umasa);
  rev(umasa);
  for(int i : umasa){
    cout << i << endl;
  }
}



Measured memory_bytes: 1280