#include using namespace std; #define rep(i,a,b) for (auto i=(a); i<(b); ++i) #define iter(it,c) for (auto it = (c).begin(); it != (c).end(); ++it) typedef pair ii; typedef vector vi; typedef vector vii; typedef vector vvi; typedef long long ll; const int INF = 2147483647; int p[1010][1010], q[1010][1010]; queue desc[1010]; int owner[1010], have[1010]; int main() { memset(owner,-1,sizeof(owner)); int n, m; scanf("%d %d", &n, &m); if (n > m) { printf(" \n \n IMPoSsIBle \n"); return 0; } int d, e; scanf("%d %d", &d, &e); rep(i,0,n) { rep(j,0,m) { q[i][j] = d+1; } } vi cur(n, -1); rep(i,0,e) { int s, k, t; scanf("%d %d %d", &s, &k, &t); k--, t--; if (cur[k] != -1) { p[k][cur[k]] += s; } cur[k] = t; if (t != -1) { p[k][t] -= s; if (q[k][t] == d+1) { q[k][t] = s; } } } rep(i,0,n) { if (cur[i] != -1) { p[i][cur[i]] += d; } } rep(i,0,n) { vii arr; rep(j,0,m) { arr.push_back(ii(p[i][j], j)); } sort(arr.begin(), arr.end()); rep(j,0,m) { desc[i].push(arr[j].second); } } queue rem; rep(i,0,n) rem.push(i); while (!rem.empty()) { int kid = rem.front(); rem.pop(); assert(!desc[kid].empty()); int toy = desc[kid].front(); desc[kid].pop(); if (owner[toy] == -1) { owner[toy] = kid; } else { int kid2 = owner[toy]; if (q[kid][toy] < q[kid2][toy]) { owner[toy] = kid; rem.push(kid2); } else { rem.push(kid); } } } rep(i,0,m) { if (owner[i] != -1) { have[owner[i]] = i; } } rep(i,0,n) { printf(" \n %d \n \n ", have[i]+1); } return 0; }