#include <cmath>
#include <vector>
#include <climits>
#include <iostream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <algorithm>
using namespace std;
class Applicant {
public:
int No;
int GE;
int GI;
int finalGrade;
int rank;
int choices[5] = { -1, -1, -1, -1, -1 };
};
bool compare1080(Applicant a1, Applicant a2) {
return a1.finalGrade != a2.finalGrade ? a1.finalGrade > a2.finalGrade : a1.GE > a2.GE;
}
class School {
public:
int quota; // 计划录取人数
int lastAdmitRank;
vector<int> applicants; // 录取名单
};
int main() {
int N, M, K;
cin >> N >> M >> K;
vector<School> schools(M);
for (int i = 0; i < M; i++) {
cin >> schools[i].quota;
}
vector<Applicant> table(N);
for (int i = 0; i < N; i++) {
cin >> table[i].GE >> table[i].GI;
table[i].finalGrade = table[i].GE + table[i].GI;
for (int j = 0; j < K; j++) {
cin >> table[i].choices[j];
}
table[i].No = i;
}
// 排名次
Applicant lastApplicant;
sort(table.begin(), table.end(), compare1080);
for (int i = 0; i < N; i++) {
if (table[i].finalGrade == lastApplicant.finalGrade && table[i].GE == lastApplicant.GE) {
table[i].rank = lastApplicant.rank;
}
else {
table[i].rank = i + 1;
}
lastApplicant = table[i];
}
vector<vector<int>> applicants(M);
for (int i = 0; i < N; i++) {
for (int j = 0; j < K; j++) {
int schoolNo = table[i].choices[j];
School& school = schools[schoolNo];
if (school.quota > school.applicants.size() || (school.quota <= school.applicants.size() && school.lastAdmitRank == table[i].rank)) {
school.lastAdmitRank = table[i].rank;
school.applicants.push_back(table[i].No);
break;
}
}
}
for (int i = 0; i < M; i++) {
vector<int> &applicants = schools[i].applicants;
sort(applicants.begin(), applicants.end());
for (int j = 0; j < applicants.size(); j++) {
if (j != 0) cout << " ";
cout << applicants[j];
}
cout << endl;
}
return 0;
}