//注意:排序的是满分解题数,而不是解题数。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 200005;
typedef long long ll;
struct st{
int num,k[6],total_grade,total_q,order,t;//t代表解决题数,total_q代表完美解题数
}s[100005];
bool cmp(st p,st q) {//排序
if(p.total_grade != q.total_grade) return p.total_grade > q.total_grade;
else if(p.total_q != q.total_q) return p.total_q > q.total_q;
else return p.num < q.num;
}
int main() {
int n,k,kk[6],m;
scanf("%d%d%d",&n,&k,&m);
for(int i = 1; i <= k; i++) scanf("%d",&kk[i]);//每科满分
int sno,num,grade;
for(int i = 1; i <= n; i++) {
s[i].num = i;
s[i].total_grade = 0;
s[i].total_q = 0;
s[i].t = -1;
memset(s[i].k,-1,sizeof(s[i].k));
}
for(int i = 1; i <= m; i++) {
scanf("%d%d%d",&sno,&num,&grade);
if(grade >=0 ) {
s[sno].t = 1;
} else grade = 0;
s[sno].k[num] = max(s[sno].k[num],grade);
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= k; j++) {
if(s[i].k[j] != -1) s[i].total_grade += s[i].k[j];
if(s[i].k[j] ==kk[j]) s[i].total_q++;
}
}
sort(s+1,s+1+n,cmp);
for(int i = 1; i <= n; i++) {
if(s[i].total_grade == s[i-1].total_grade) s[i].order = s[i-1].order;
else s[i].order = i;
}
/*for(int i = 1; i <= n; i++) printf("%d ",s[i].t);
printf("
");*/
for(int i = 1; i <= n; i++) {
if(s[i].t == 1) {
printf("%d %05d %d",s[i].order,s[i].num,s[i].total_grade);
for(int j = 1; j <= k; j++) {
if(s[i].k[j] == -1) printf(" -");
else printf(" %d",s[i].k[j]);
}
printf("
");
}
}
return 0;
}