/*
  ICPCの解答提出のログが与えられたとき， 各チームの順位を表示
 */

#include <stdio.h>

#define T_MAX 50 // チーム数の上限
#define P_MAX 10 // 問題数の上限

// フラグ
#define SORTED 0 
#define NOT_SORTED -1

/* 構造体Team_score: チームあたりのデータ */
typedef struct {
  long time; // 所要時間
  int num; // 回答問題数
  int penalty[P_MAX]; // 問題
} Team_score;

int main(void) {
  int M, T, P, R; // コンテストの始まりから終わりまでの時間、チーム数、問題数、提出記録の数
  
  while (scanf("%d %d %d %d", &M, &T, &P, &R) != EOF) { // 一行ずつデータを読み込む
    int i, k;
    int m, t, p, j; // 経過時間、チーム番号、問題番号、正誤
    Team_score scores[T_MAX];
    int ranking[T_MAX]; // 順位の順番にチーム番号を格納（ただしチーム番号は-1されている）
    int flag_sorted;
    
    if (M==0 && T==0 && P==0 && R==0) // 終了判定
      break;

    /* チーム記録（構造体）を0で初期化 */
    for (i=0; i<T; i++) {
      scores[i].time = 0;
      scores[i].num = 0;
      for (k=0; k<P; k++) {
	scores[i].penalty[k] = 0;
      }
    }


    /* 提出記録を順番に読み込んで、各チームの正解数、所要時間などを計算 */
    for (i=0; i<R; i++) {
      
      scanf("%d %d %d %d", &m, &t, &p, &j); // 提出記録を読み込む
      if (j == 0) { // もし問題に正解していれば
	scores[t-1].time += m + scores[t-1].penalty[p-1] * 20; // 所要時間を加算
	scores[t-1].num += 1; // 正解問題数をインクリメント
      } else { // もし誤答だったら
	scores[t-1].penalty[p-1] += 1; // 問題あたりの誤答数をインクリメント
      }
    }

    /* 順位を表す配列を初期化 */
    for (i=0; i<T; i++) 
      ranking[i] = i;

    /* 順位付け: 順位の基準にしたがって、チームの順番をソートして順位付け */
    do {
      flag_sorted = NOT_SORTED;
      
      for (k=0; k<=T-2; k++) {
	if (/* 正答数が多いか */
	    (scores[ranking[k]].num < scores[ranking[k+1]].num)
	    /* 正当数は同じであるが、所要時間が短いか */
	    || (scores[ranking[k]].num == scores[ranking[k+1]].num
		&& scores[ranking[k]].time > scores[ranking[k+1]].time)
	    /* 同じ順位であるが、後ろのほうがチーム番号が多いとき */
	    || (scores[ranking[k]].num == scores[ranking[k+1]].num
		&& scores[ranking[k]].time == scores[ranking[k+1]].time
		&& ranking[k] < ranking[k+1])) {
	  /* チーム番号を入れ替え */
	  int tmp = ranking[k];
	  ranking[k] = ranking[k+1];
	  ranking[k+1] = tmp;

	  flag_sorted = SORTED; // 入れ替えられた
	}
      }
    } while (flag_sorted == SORTED); // 入れ替えられなくなったら終了

    /* 順位を表示 */
    printf("%d", ranking[0]+1); // トップのチームの番号を表示 
    for (i=1; i<T; i++) {
      if (scores[ranking[i-1]].num == scores[ranking[i]].num
	  && scores[ranking[i-1]].time == scores[ranking[i]].time) { // 前のチームと同順だったら
	printf("=%d", ranking[i]+1); // '='を使って表示
      } else { //そうでなかったら
	printf(",%d", ranking[i]+1); // ','を使って表示
      }
    }
    putchar('\n');
  }
  
  return 0;
}