import java.util.*;
public class DN11_63230317 {
static class Rezultat {
String tekmovalec;
String država;
String disciplina;
int točke;
public Rezultat (String te, String dr, String di, int to) {
tekmovalec = te;
država = dr;
disciplina = di;
točke = to;
}
static class Primerjalnik implements Comparator<Rezultat> {
int pravila[];
boolean obratno[];
public Primerjalnik (int[] p, boolean[] o) {
pravila = p;
obratno = o;
}
@Override
public int compare (Rezultat a, Rezultat b) {
for (int i = 0; i < pravila.length; i++) {
if (pravila[i] == 0) {
int r = a.tekmovalec.compareTo(b.tekmovalec);
if (r != 0)
return obratno[i] ? -r : r;
}
if (pravila[i] == 1) {
int r = a.država.compareTo(b.država);
if (r != 0)
return obratno[i] ? -r : r;
}
if (pravila[i] == 2) {
int r = a.disciplina.compareTo(b.disciplina);
if (r != 0)
return obratno[i] ? -r : r;
}
if (pravila[i] == 3) {
int r = Integer.compare(a.točke, b.točke);
if (r != 0)
return obratno[i] ? -r : r;
}
}
return 0;
}
}
}
static class Trojka implements Comparable<Trojka> { // zares Nka
int[] trojka;
public Trojka (int[] a) {
trojka = a;
}
@Override
public int compareTo (Trojka o) {
if (o.trojka.length < trojka.length)
return -1;
if (o.trojka.length > trojka.length)
return 1;
for (int i = 0; i < trojka.length; i++)
if (Integer.compare(trojka[i], o.trojka[i]) != 0)
return Integer.compare(trojka[i], o.trojka[i]);
return 0;
}
}
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int u = sc.nextInt();
ArrayList<Rezultat> rezultati = new ArrayList<>();
for (int i = 0; i < n; i++) {
String tekmovalec = sc.next();
String država = sc.next();
String disciplina = sc.next();
int točke = sc.nextInt();
rezultati.add(new Rezultat(tekmovalec, država, disciplina, točke));
}
String prejšnja = "";
String prejšnji = "";
switch (u) {
case 1:
Collections.sort(rezultati, new Rezultat.Primerjalnik(new int[]{1, 0, 2, 3}, new boolean[]{false, false, false, false}));
for (Rezultat rezultat : rezultati) {
if (!prejšnja.equals(rezultat.država)) {
System.out.println("[" + rezultat.država + "]");
prejšnja = rezultat.država;
prejšnji = "";
}
if (!prejšnji.equals(rezultat.tekmovalec))
System.out.println(" " + rezultat.tekmovalec);
prejšnji = rezultat.tekmovalec;
}
break;
case 2:
Collections.sort(rezultati, new Rezultat.Primerjalnik(new int[]{2, 3, 0, 1}, new boolean[]{false, true, false, false}));
for (Rezultat rezultat : rezultati) {
if (!prejšnja.equals(rezultat.disciplina)) {
System.out.println("[" + rezultat.disciplina + "]");
prejšnja = rezultat.disciplina;
}
System.out.println(" " + rezultat.tekmovalec + " " + rezultat.država + " " + rezultat.točke);
}
break;
case 3:
Collections.sort(rezultati, new Rezultat.Primerjalnik(new int[]{2, 3, 0, 1}, new boolean[]{false, true, false, false}));
Map<String, Trojka> države = new TreeMap<>();
int i = 0;
for (Rezultat rezultat : rezultati) {
if (!prejšnja.equals(rezultat.disciplina)) {
prejšnja = rezultat.disciplina;
i = 0;
}
Trojka cur = države.get(rezultat.država);
if (cur == null) {
cur = new Trojka(new int[]{0, 0, 0});
države.put(rezultat.država, cur);
}
if (i < 3)
cur.trojka[i++]++;
}
ArrayList<Država> urejeneDržave = new ArrayList<>();
for (String key : države.keySet())
urejeneDržave.add(new Država(key, države.get(key)));
Collections.sort(urejeneDržave);
for (Država država : urejeneDržave)
System.out.println(država);
break;
}
}
static class Država implements Comparable<Država> {
String ime;
Trojka medalje;
public Država (String i, Trojka m) {
ime = i;
medalje = m;
}
@Override
public int compareTo (Država o) {
return -medalje.compareTo(o.medalje);
}
@Override
public String toString () {
return ime + " " + medalje.trojka[0] + " " + medalje.trojka[1] + " " + medalje.trojka[2];
}
}
}