#include <iostream>
#include<vector>
#include<map>
#include<algorithm>
#include<cstring>
#include<string>
#include <set>
#include <cassert>
#include<cmath>
#include<climits>
#include<iomanip>
using namespace std;
#define MOD 1000000007
#define ll long long
const long long INF = 1LL << 60;

template<class T> inline bool chmin(T& a, T b) {
	if (a > b) {
		a = b;
		return true;
	}
	return false;
}
template<class T> inline bool chmax(T& a, T b) {
	if (a < b) {
		a = b;
		return true;
	}
	return false;
}

class UnionFind {
	vector<int> data;
public:
	UnionFind(int size) : data(size, -1) { }
	bool unionSet(int x, int y) {
		x = root(x); y = root(y);
		if (x != y) {
			if (data[y] < data[x]) swap(x, y);
			data[x] += data[y]; data[y] = x;
		}
		return x != y;
	}
	bool findSet(int x, int y) {
		return root(x) == root(y);
	}
	int root(int x) {
		return data[x] < 0 ? x : data[x] = root(data[x]);
	}
	int size(int x) {
		return -data[root(x)];
	}
};

int find(vector<long long> &arr, long long obj) {
	if (arr[arr.size() - 1] < obj)return arr.size()-1;
	if (arr[0] > obj)return -1;

	int min = 0; int max = arr.size() - 1;
	for (int i = 0; i < arr.size(); i++) {
		if (arr[min+(max-min) / 2] > obj) {
			max = min + (max - min) / 2;
		}
		else {
			min = min + (max - min) / 2;
		}
		if (max - min == 1) {
			return min;
		}
	}


}

//約数求める //約数
void divisor(ll n,vector<ll> &ret) {
	for (ll i = 1; i * i <= n; i++) {
		if (n % i == 0) {
			ret.push_back(i);
			if (i * i != n) ret.push_back(n / i);
		}
	}
	sort(ret.begin(), ret.end());
	
}
//階乗
long long factorial(long long n, long long mod) {
	long long ret = 1;
	for (long long i = 1; i <= n; i++) {
		ret = (ret * i) % mod;
	}
	return ret;
}
//モジュラ逆数
long long inv_mod(long long n, long long mod) {
	long long a = n % mod, b = mod - 2, ret = 1;
	while (b > 0) {
		if (b & 1) ret = (ret * a) % mod;
		a = (a * a) % mod;
		b >>= 1;
	}
	return ret;
}

long long nPr(long long n, long long r, long long mod) {
	long long ret = 1;
	for (long long i = n; i >= n - r + 1; i--) {
		ret = ret * (i % mod) % mod;
	}
	return ret;
}

long long nCr(long long n, long long r, long long mod) {
	return nPr(n, r, mod) * inv_mod(factorial(r, mod), mod) % mod;
}

ll gcd(ll m, ll n){
	if (n == 0)return m;
	return gcd(n, m%n);
}//gcd



vector<vector<ll>> dp;
int main() {
	ll x, y, z, k;
	cin >> x >> y >> z >> k;
	vector<vector<ll>> a(3);
	a[0].resize(x);
	a[1].resize(y);
	a[2].resize(z);
	for (int i = 0; i < x; i++)cin >> a[0][i];
	for (int i = 0; i < y; i++)cin >> a[1][i];
	for (int i = 0; i < z; i++)cin >> a[2][i];
	sort(a[0].begin(), a[0].end(), greater<ll>());
	sort(a[1].begin(), a[1].end(), greater<ll>());
	sort(a[2].begin(), a[2].end(), greater<ll>());
	dp.resize(k);
	for (int i = 0; i < k; i++)dp[i].resize(3);
	dp[0][0]=dp[0][1]=dp[0][2] = 0;
	ll now = a[0][0] + a[1][0] + a[2][0];
	ll max = 0;
	ll *ans = new ll[k];
	ans[0] = a[0][0] + a[1][0] + a[2][0];
	map<ll, int> ma;
	for (int i = 1; i < k; i++) {
		int flag = 0;
		max = 0;
		for (int j = 0; j < i; j++) {
			
			if (ma[(dp[j][0] + 1) * 1000000 + dp[j][1] * 1000 + dp[j][2]] == 0&&dp[j][0]+1<x) {
				ll temp = a[0][dp[j][0] + 1] + a[1][dp[j][1]] + a[2][dp[j][2]];
				if (max < temp) {
					max = temp;
					flag = (dp[j][0] + 1) * 1000000 + dp[j][1] * 1000 + dp[j][2];
										
				}
			}
			if (ma[(dp[j][0] ) * 1000000 + (dp[j][1]+1) * 1000 + dp[j][2]] == 0 && dp[j][1] + 1 < y) {
				ll temp = a[0][dp[j][0] ] + a[1][dp[j][1]+1] + a[2][dp[j][2]];
				if (max < temp) {
					max = temp;
					flag = (dp[j][0]) * 1000000 + (dp[j][1] + 1) * 1000 + dp[j][2];
					
				}
			}
			if (ma[(dp[j][0]) * 1000000 + (dp[j][1] ) * 1000 + dp[j][2]+1] == 0 && dp[j][2] + 1 < z) {
				ll temp = a[0][dp[j][0]] + a[1][dp[j][1] ] + a[2][dp[j][2]+1];
				if (max < temp) {
					max = temp;
					flag = (dp[j][0]) * 1000000 + (dp[j][1]) * 1000 + dp[j][2] + 1;
					
				}
			}

		}
		ma[flag]=2;
		ans[i] = max;
		dp[i][0] = flag / 1000000; dp[i][1] = (flag - dp[i][0] * 1000000) / 1000;
		dp[i][2] = flag - dp[i][0] * 1000000 - dp[i][1] * 1000;
	}

	for (int i = 0; i < k; i++) {
		cout << ans[i] << endl;
	}


	return 0;
}


Measured memory_bytes: 896