#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct node
{
int id, ge, gi, choice[5];
double finalgrade;
}stu[40010];
int cmp(node n1, node n2)
{
if(n1.finalgrade != n2.finalgrade)
{
return n1.finalgrade > n2.finalgrade;
}
return n1.ge > n2.ge;
}
int main()
{
int n, m, k;
scanf("%d%d%d", &n, &m, &k);
int i, admit[110];
for(i = 0; i < m; i++)
{
scanf("%d", &admit[i]);
}
int j;
for(i = 0; i < n; i++)
{
scanf("%d%d", &stu[i].ge, &stu[i].gi);
for(j = 0; j < k; j++)
{
scanf("%d", &stu[i].choice[j]);
}
stu[i].id = i;
stu[i].finalgrade = (stu[i].ge + stu[i].gi) * 1.0 / 2;
}
sort(stu, stu + n, cmp);
int curchoice, former[110], formerindex, flag;
vector<int> v[110];
for(i = 0; i < n; i++)
{
flag = 0;
for(j = 0; j < k; j++)
{
curchoice = stu[i].choice[j];
if(admit[curchoice] > 0)
{
flag = 1;
}
else
{
formerindex = former[curchoice];
if(stu[formerindex].finalgrade == stu[i].finalgrade && stu[formerindex].ge == stu[i].ge)
{
flag = 1;
}
}
if(flag == 1)
{
admit[curchoice]--;
former[curchoice] = i;
v[curchoice].push_back(stu[i].id);
break;
}
}
}
int size;
for(i = 0; i < m; i++)
{
sort(v[i].begin(), v[i].end());
size = v[i].size();
for(j = 0; j < size; j++)
{
if(j > 0)
{
printf(" ");
}
printf("%d", v[i][j]);
}
printf("\n");
}
system("pause");
return 0;
}