#include <stdio.h>
#include <iostream>
#include <bitset>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
struct contestant{
int score, penalty, num;
contestant(): score(0), penalty(0){ }
};
struct comp{
bool operator()(contestant *a, contestant *b){
return a->score>b->score || (a->score==b->score&&(a->penalty<b->penalty || (a->penalty==b->penalty&& a->num<b->num)) );
}
};
int main(){
vector <int> inc(1600);
bitset<101> part;
bitset<1600> solv;
int tc, cn, pn, tn;
char ch;
cin>>tc;
while (tc--){
fill(inc.begin(), inc.end(), 0);
contestant con[101]; for (int i=1; i<101; con[i].num=i , ++i);
part.reset(), solv.reset();
while (true){
char nc;
scanf("%d %d %d %c", &cn, &pn, &tn, &ch);
while (true){
nc=cin.peek();
if (nc!='\n'&&nc!=EOF) getchar();
else {
if (nc=='\n') getchar();
break;
}
}
part.set(cn);
int solnum=cn*pn;
if (!solv[solnum]){
if (ch=='C'){
solv.set(solnum);
++con[cn].score;
con[cn].penalty+=tn + inc[solnum]*20;
}
else if(ch=='I'){
++inc[solnum];
}
}
nc=cin.peek();
while (isspace(nc)&&nc!='\n'){
getchar();
nc=cin.peek();
}
if (nc=='\n'||nc==EOF) break;
}
set <contestant *, comp > board;
for (int i=1; i<101; ++i){
if (part[i]){
board.insert(con+i);
}
}
set <contestant *, comp >::iterator fit=board.begin(), lit=board.end();
while(fit!=lit){
printf("%d %d %d\n", (*fit)->num, (*fit)->score, (*fit)->penalty);
++fit;
} if (tc)printf("\n");
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGJpdHNldD4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHNldD4KI2luY2x1ZGUgPGFsZ29yaXRobT4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgY29udGVzdGFudHsKICAgIGludCBzY29yZSwgcGVuYWx0eSwgbnVtOwoJY29udGVzdGFudCgpOiBzY29yZSgwKSwgcGVuYWx0eSgwKXsJfQp9OwoKCgpzdHJ1Y3QgY29tcHsKCWJvb2wgb3BlcmF0b3IoKShjb250ZXN0YW50ICphLCBjb250ZXN0YW50ICpiKXsKCQlyZXR1cm4gYS0+c2NvcmU+Yi0+c2NvcmUgfHwgKGEtPnNjb3JlPT1iLT5zY29yZSYmKGEtPnBlbmFsdHk8Yi0+cGVuYWx0eSB8fCAoYS0+cGVuYWx0eT09Yi0+cGVuYWx0eSYmIGEtPm51bTxiLT5udW0pKSApOwoJfQp9OwoKaW50IG1haW4oKXsKCXZlY3RvciA8aW50PiBpbmMoMTYwMCk7CgliaXRzZXQ8MTAxPiBwYXJ0OwoJYml0c2V0PDE2MDA+IHNvbHY7CglpbnQgdGMsIGNuLCBwbiwgdG47CgljaGFyIGNoOwoJY2luPj50YzsgCgl3aGlsZSAodGMtLSl7CgkJZmlsbChpbmMuYmVnaW4oKSwgaW5jLmVuZCgpLCAwKTsKCQljb250ZXN0YW50IGNvblsxMDFdOyBmb3IgKGludCBpPTE7IGk8MTAxOyBjb25baV0ubnVtPWkgLCArK2kpOwoJCXBhcnQucmVzZXQoKSwgc29sdi5yZXNldCgpOwoJCXdoaWxlICh0cnVlKXsKCQkJY2hhciBuYzsKCQkJc2NhbmYoIiVkICVkICVkICVjIiwgJmNuLCAmcG4sICZ0biwgJmNoKTsKCQkJd2hpbGUgKHRydWUpewoJCQkJbmM9Y2luLnBlZWsoKTsKCQkJCWlmIChuYyE9J1xuJyYmbmMhPUVPRikgZ2V0Y2hhcigpOwoJCQkJZWxzZSB7CgkJCQkJaWYgKG5jPT0nXG4nKSBnZXRjaGFyKCk7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQkJCgkJCXBhcnQuc2V0KGNuKTsKCQkJaW50IHNvbG51bT1jbipwbjsKCQkJaWYgKCFzb2x2W3NvbG51bV0pewoJCQkJaWYgKGNoPT0nQycpewoJCQkJCXNvbHYuc2V0KHNvbG51bSk7CgkJCQkJKytjb25bY25dLnNjb3JlOwoJCQkJCWNvbltjbl0ucGVuYWx0eSs9dG4gKyBpbmNbc29sbnVtXSoyMDsKCQkJCX0KCQkJCWVsc2UgaWYoY2g9PSdJJyl7CgkJCQkJKytpbmNbc29sbnVtXTsKCQkJCX0KCQkJfQoJCQluYz1jaW4ucGVlaygpOwoJCQl3aGlsZSAoaXNzcGFjZShuYykmJm5jIT0nXG4nKXsKCQkJCWdldGNoYXIoKTsKCQkJCW5jPWNpbi5wZWVrKCk7CgkJCX0KCQkJaWYgKG5jPT0nXG4nfHxuYz09RU9GKSBicmVhazsKCQl9CgkJCgkJc2V0IDxjb250ZXN0YW50ICosIGNvbXAgPiBib2FyZDsKCQlmb3IgKGludCBpPTE7IGk8MTAxOyArK2kpewoJCQlpZiAocGFydFtpXSl7CgkJCQlib2FyZC5pbnNlcnQoY29uK2kpOwoJCQl9CgkJfQoJCQoJCXNldCA8Y29udGVzdGFudCAqLCBjb21wID46Oml0ZXJhdG9yIGZpdD1ib2FyZC5iZWdpbigpLCBsaXQ9Ym9hcmQuZW5kKCk7CgkJd2hpbGUoZml0IT1saXQpewoJCQlwcmludGYoIiVkICVkICVkXG4iLCAoKmZpdCktPm51bSwgKCpmaXQpLT5zY29yZSwgKCpmaXQpLT5wZW5hbHR5KTsKCQkJKytmaXQ7CgkJfSBpZiAodGMpcHJpbnRmKCJcbiIpOwoJCQoJfQoJcmV0dXJuIDA7Cn0=