#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

struct Node {
    int name;
    int pen;
    int ac;
    vector<int> wa;
    Node(int n, int P) : name(n), pen(0), ac(0), wa(P, 0) { }
    // 0origin
    void accept(int i, int t) {
        ac++;
        pen += wa[i] * 20 + t;
    }

    void wrong(int i) {
        wa[i]++;
    }

    bool operator <(const Node & n) const {
        if(ac != n.ac) return ac > n.ac;
        if(pen != n.pen) return pen < n.pen;
        return name > n.name;
    }

    bool same(const Node & n) const {
        return ac == n.ac && pen == n.pen;
    }
};

int main() {
    for(int M, T, P, R; cin >> M >> T >> P >> R, M || T || P || R; ) {
        vector<Node> vec;
        for(int i = 0; i < T; i++) vec.push_back(Node(i+1, P));
        for(int i = 0; i < R; i++) {
            int m, t, p, j; cin >> m >> t >> p >> j;
            t--;
            p--;
            if(j == 0) {
                vec[t].accept(p, m);
            }
            else {
                vec[t].wrong(p);
            }
        }
        sort(vec.begin(), vec.end());
        cout << vec[0].name;
        for(int i = 1; i < (int)vec.size(); i++) {
            if(vec[i - 1].same(vec[i])) cout << "=";
            else cout << ",";
            cout << vec[i].name;
        }
        cout << endl;
    }
}
