#include <stdio.h>

/* 1 チームの記録 */
typedef struct team {
	int no;
    int time;
	int score;
} Team;

/* チームの記録を入れ換える */
void swap(Team *a, Team *b){
	Team c;
	c = *b;
	*b = *a;
	*a = c;
}

/* チームの順位を判定する (sort で使用, 入れ換えるか否かを返す) */
int compare(Team a, Team b){
	if (a.score < b.score){
		return 1;
	}else if (a.score > b.score){
		return 0;
	}

	if (a.time > b.time){
		return 1;
	}else if (a.time < b.time){
		return 0;
	}

	if (a.no < b.no){
		return 1;
	}
	return 0;
}

/* チームの順位を判定し並び替える */
void sort(Team *t, int length){
	int i, j;
	for (i = 0; i < length - 1; i++){
		for (j = 0; j < length - 1 - i; j++){
			if (compare(t[j], t[j+1])){
				swap(&t[j], &t[j+1]);
			}
		}
	}
}

int main(void){
	int M, T, P, R;
	int m, t, p, j;
	Team teams[50];
	int penalty_num[50][10];
	int i, k;

	while (scanf("%d %d %d %d", &M, &T, &P, &R) == 4){
		if (M == 0 && T == 0 && P == 0 && R == 0){
			break;
		}

		/* 初期化 */
		for (i = 0; i < T; i++){
			teams[i].no = i + 1;
			teams[i].time = 0;
			teams[i].score = 0;
			for (k = 0; k < P; k++){
				penalty_num[i][k] = 0;
			}
		}

		/* 解答提出ログを読み込む */
		for (i = 0; i < R; i++){
			scanf("%d %d %d %d", &m, &t, &p, &j);
			t--;
			p--;
			if (j != 0){
				/* 不正解 */
				penalty_num[t][p]++;  /* 誤答回数を記録する */
				continue;
			}

			/* 正解 */
			/* 誤答回数 * 20 分をペナルティとして加算する */
			teams[t].time += m + penalty_num[t][p] * 20;
			teams[t].score++;
		}

		/* 順位の高い順に並び替える */
		sort(teams, T);

		/* 順位の高い順に出力する */
		for (i = 0; i < T; i++){
			printf("%d", teams[i].no);
			/* 区切り文字 */
			if (i < T - 1){
				if (teams[i].score == teams[i+1].score && teams[i].time == teams[i+1].time){
					printf("=");  /* 同順位 */
				}else{
					printf(",");
				}
			}
		}
		printf("\n");
	}

    return 0;
}