#include<iostream>
#include<vector>
#include<algorithm>
#include<cctype>
#include<utility>
#include<string>
#include<cmath>
#include<cstring>
#include<queue>
#include<map>
#include<queue>

#define REP(i, n) for(int i = 0;i < n;i++)
#define REPR(i, n) for(int i = n;i >= 0;i--)
#define FOR(i, m, n) for(int i = m;i < n;i++)
#define FORR(i, m, n) for(int i = m;i >= n;i--)
#define SORT(v, n) sort(v, v+n);
#define VSORT(v) sort(v.begin(), v.end());
#define llong long long
#define pb(a) push_back(a)
#define INF 1000000007
using namespace std;
typedef pair<int, int> P;
typedef pair<llong, llong> LP;
typedef pair<int, P> PP;
typedef pair<llong, LP> LPP;
typedef long long int ll;
ll dx[4] = {1,0,0,-1};
ll dy[4] = {0,1,-1,0};

#define ARRAY_MAX 1005

typedef struct data{

    int team_number;
    int number;//順位
    int penalty[2][15];//penalty[WA回数][解けたかどうか]
    int ac_sum;//AC数
    int passed_time;//経過時間

}DATA;


bool comp(const DATA& a,const DATA& b){
    //昇順ソート
    if(a.ac_sum == b.ac_sum){
        //AC数が同じ
        if(a.passed_time == b.passed_time){
            //AC数も時間も同じ場合は順位は同じだが、並べる順番がチーム番号の大きい順のため
            return a.team_number > b.team_number;
        }else{
            return a.passed_time < b.passed_time;
        }
    }else{
        //AC数が同じ場合はAC数の大きい方が順位が先
        return a.ac_sum > b.ac_sum;
    }



}


int main(){

    int M,T,P,R;
    while(cin >> M >> T >> P >> R,M){

        vector<DATA> a(T);
        
        REP(i,T){
            //チーム番号の格納、WAテーブルの初期化
            a[i].team_number = i+1;
            REP(j,2){
                REP(k,15){
                    a[i].penalty[j][k] = 0;
                }
            }
        }

        int m,t,p,j;
        REP(i,R){
            //各チームのデータの整理
            cin >> m >> t >> p >> j;
            if(j){
                //WAの場合
                a[t-1].penalty[0][p-1]++;
            }else{
                a[t-1].penalty[1][p-1] = 1;//解けた
                a[t-1].passed_time += m;//解くまでの時間はこの時点で足しておく
                a[t-1].ac_sum++;//AC数を1つ増やす
            }
        }

        //ペナルティ加算後の経過時間の計算
        REP(i,T){
            REP(j,P){
                if(a[i].penalty[1][j] == 1){
                    //解けているのでWA数×20を足す
                    a[i].passed_time += a[i].penalty[0][j]*20;
                }
            }
        }

        sort(a.begin(),a.end(),comp);
        
        //順位付けをつける処理
        a[0].number = 1;
        for(int i = 1;i < T;i++){

            if(a[i-1].ac_sum == a[i].ac_sum){
                //AC数が同じ
                if(a[i-1].passed_time == a[i].passed_time){
                    //AC数も経過時間も同じ
                    a[i].number = a[i-1].number;
                }else{
                    //経過時間が長い
                    a[i].number = a[i-1].number + 1;
                }
            }else{
                //AC数が少ない
                a[i].number = a[i-1].number + 1;
            }
        }
        //順位の表示処理
        REP(i,T){
            if(i == 0){
                cout << a[i].team_number;
            }else{
                if(a[i-1].number < a[i].number){
                    cout << "," << a[i].team_number;
                }else{
                    cout << "=" << a[i].team_number;
                }
            }
        }
        cout << endl;
        a.shrink_to_fit();//メモリ開放
    }




    return 0;
}


Measured memory_bytes: 3140