#include <bits/stdc++.h>

using namespace std;

struct Data {
	int i, j, c;
	Data() {};
	Data(int i_, int j_, int c_) : i(i_), j(j_), c(c_) {};
};
bool operator <(Data a, Data b) {
	return a.c < b.c;
}

priority_queue<Data> q;

vector<int> findHighestSums(vector< vector<int> > lists, int n) {
	int L = (int) lists.size();
	vector<int> ans;
	for (int i = 1; i < L; ++i) {
		while (! q.empty()) q.pop();
		for (int j = 0; j < lists[i].size(); ++j) {
			q.push(Data(0, j, lists[0][0] + lists[i][j]));
		}
		for (int j = 0; j < n && ! q.empty(); ++j) {
			Data k = q.top(); q.pop();
			ans.push_back(k.c);
			if (k.i + 1 < lists[0].size()) {
				q.push(Data(k.i + 1, k.j, lists[0][k.i + 1] + lists[i][k.j]));
			}
		}
		lists[0] = ans;
		ans.clear();
	}
	return lists[0];
}

int main() {
	int n = 5;
	
	vector< vector<int> > a(5);
	a[0] = {5,4,3,2,1};
	a[1] = {4,1};
	a[2] = {5,0,0};
	a[3] = {6,4,2};
	a[4] = {1};
	vector<int> ans = findHighestSums(a, n);
	for (int i = 0; i < ans.size(); ++i)
		cout << ans[i] << ' ';
	cout << '\n';
	return 0;
}
