#include <iostream>
using namespace std;
int nilai[100][4];
bool bandingkan(int a, int b) {
if(nilai[a][3] > nilai[b][3]) return true;
else if(nilai[a][3] < nilai[b][3]) return false;
else if(nilai[a][2] > nilai[b][2]) return true;
else if(nilai[a][2] < nilai[b][2]) return false;
else if(nilai[a][1] > nilai[b][1]) return true;
else return false;
}
void tukar(int a, int b) {
int tmp;
for(int i = 0; i < 4; i++) {
tmp = nilai[a][i];
nilai[a][i] = nilai[b][i];
nilai[b][i] = tmp;
}
}
int main() {
int T, N, M;
cin >> T;
while(T--) {
// input data
cin >> N >> M;
for(int i = 0; i < N; i++) {
nilai[i][0] = i+1;
cin >> nilai[i][1] >> nilai[i][2] >> nilai[i][3];
}
// bubble sort
for(int i = 0; i < N; i++)
for(int j = 1; j < N; j++)
if(bandingkan(j, j-1)) {
tukar(j, j-1);
}
for(int i = 0; i < N; i++) {
for(int j = 0; j < 4; j++)
cout << nilai[i][j] << " ";
cout << endl;
}
}
return 0;
}
/*
2 0 0 200
> 1 10 100 100
> 3 1 100 100
*/
/* sorting
O(N^2) -> bubble, insertion, selection
O(N*log(N)) -> mergesort, quick
*/
/*
N = a*b -> a < b
a > sqrt(N) dan b > sqrt(N) -> a*b > N -> kontradiksi
a <= sqrt(N)
Big-O = perubahan runtime tergantung variabel apa & seberapa
O(N)
N = 1 -> rt = 1ms
N = 10 -> rt = 10ms
O(sqrt(N))
N = 1 -> rt = 1ms
N = 100 -> rt = 10ms
O(1)
N = 1 -> rt = 1ms
N = 100 -> rt = 1ms
O(N^2) > O(N*sqrt(N)) > O(N*log N) > O(N) > O(sqrt(N)) > O(log N) > O(1)
O(E+V):
for(i = 1 -- E) {
...
}
for(i = 1 -- V) {
...
}
O(E*V)
for(i = 1 -- E) {
for(j = 1 -- V) {
...
}
}
*/
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IG5pbGFpWzEwMF1bNF07Cgpib29sIGJhbmRpbmdrYW4oaW50IGEsIGludCBiKSB7CiAgICBpZihuaWxhaVthXVszXSA+IG5pbGFpW2JdWzNdKSByZXR1cm4gdHJ1ZTsKICAgIGVsc2UgaWYobmlsYWlbYV1bM10gPCBuaWxhaVtiXVszXSkgcmV0dXJuIGZhbHNlOwogICAgZWxzZSBpZihuaWxhaVthXVsyXSA+IG5pbGFpW2JdWzJdKSByZXR1cm4gdHJ1ZTsKICAgIGVsc2UgaWYobmlsYWlbYV1bMl0gPCBuaWxhaVtiXVsyXSkgcmV0dXJuIGZhbHNlOwogICAgZWxzZSBpZihuaWxhaVthXVsxXSA+IG5pbGFpW2JdWzFdKSByZXR1cm4gdHJ1ZTsKICAgIGVsc2UgcmV0dXJuIGZhbHNlOwp9Cgp2b2lkIHR1a2FyKGludCBhLCBpbnQgYikgewogICAgaW50IHRtcDsKICAgIGZvcihpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKICAgIAl0bXAgPSBuaWxhaVthXVtpXTsKICAgIAluaWxhaVthXVtpXSA9IG5pbGFpW2JdW2ldOwogICAgCW5pbGFpW2JdW2ldID0gdG1wOwogICAgfQp9CgppbnQgbWFpbigpIHsKICAgIGludCBULCBOLCBNOwogICAgY2luID4+IFQ7CiAgICB3aGlsZShULS0pIHsKICAgICAgICAvLyBpbnB1dCBkYXRhCiAgICAgICAgY2luID4+IE4gPj4gTTsKICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICAgICAgIG5pbGFpW2ldWzBdID0gaSsxOwogICAgICAgICAgICBjaW4gPj4gbmlsYWlbaV1bMV0gPj4gbmlsYWlbaV1bMl0gPj4gbmlsYWlbaV1bM107CiAgICAgICAgfQogICAgICAgIC8vIGJ1YmJsZSBzb3J0CiAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IE47IGkrKykKICAgICAgICAgICAgZm9yKGludCBqID0gMTsgaiA8IE47IGorKykKICAgICAgICAgICAgICAgIGlmKGJhbmRpbmdrYW4oaiwgai0xKSkgewogICAgICAgICAgICAgICAgICAgIHR1a2FyKGosIGotMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IE47IGkrKykgewogICAgICAgIAlmb3IoaW50IGogPSAwOyBqIDwgNDsgaisrKQogICAgICAgIAkJY291dCA8PCBuaWxhaVtpXVtqXSA8PCAiICI7CiAgICAgICAgCWNvdXQgPDwgZW5kbDsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMDsKfQovKgogIDIgMCAwIDIwMAo+IDEgMTAgMTAwIDEwMAo+IDMgMSAxMDAgMTAwCiovCgoKLyogc29ydGluZwpPKE5eMikgLT4gYnViYmxlLCBpbnNlcnRpb24sIHNlbGVjdGlvbgpPKE4qbG9nKE4pKSAtPiBtZXJnZXNvcnQsIHF1aWNrCiovCgovKgoKTiA9IGEqYiAtPiBhIDwgYgphID4gc3FydChOKSBkYW4gYiA+IHNxcnQoTikgLT4gYSpiID4gTiAtPiBrb250cmFkaWtzaQphIDw9IHNxcnQoTikKCkJpZy1PID0gcGVydWJhaGFuIHJ1bnRpbWUgdGVyZ2FudHVuZyB2YXJpYWJlbCBhcGEgJiBzZWJlcmFwYQpPKE4pCk4gPSAxIC0+IHJ0ID0gMW1zCk4gPSAxMCAtPiBydCA9IDEwbXMKCk8oc3FydChOKSkKTiA9IDEgLT4gcnQgPSAxbXMKTiA9IDEwMCAtPiBydCA9IDEwbXMKCk8oMSkKTiA9IDEgLT4gcnQgPSAxbXMKTiA9IDEwMCAtPiBydCA9IDFtcwoKCk8oTl4yKSA+IE8oTipzcXJ0KE4pKSA+IE8oTipsb2cgTikgPiBPKE4pID4gTyhzcXJ0KE4pKSA+IE8obG9nIE4pID4gTygxKQpPKEUrVik6CmZvcihpID0gMSAtLSBFKSB7CgkuLi4KfQpmb3IoaSA9IDEgLS0gVikgewoJLi4uCn0KCk8oRSpWKQpmb3IoaSA9IDEgLS0gRSkgewoJZm9yKGogPSAxIC0tIFYpIHsKCQkuLi4KCX0KfQoKKi8=