#include #include using namespace std; typedef unsigned int uint; typedef unsigned char byte; #define REP(i, n) for(uint i=0; i kable[8000]; uint ile_serw, ile_kabli, ile_wlasc, ile_trans, a, b, c; char serwery[8000][100]; static inline bool znajdz_cykl(uint gdzie, uint skad, uint co, byte kto) { while (gdzie != co) { bool ok = false; FOREACH(i, kable[gdzie]) if (i->second == kto && i->first != skad) { skad = gdzie; gdzie = i-> first; ok = true; break; } if (!ok) return false; } return true; } static inline uint czy_istnieje(uint a, uint b) { VAR(f, kable[a].find(b)); if (f == kable[a].end()) return NOC; return f->second; } int main() { while (1) { scanf("%d %d %d %d", &ile_serw, &ile_kabli, &ile_wlasc, &ile_trans); if (ile_serw==0 && ile_kabli==0 && ile_wlasc==0 && ile_trans==0) break; REP(i, ile_serw-1) { kable[i].clear(); REP(j, 100) serwery[i][j] = 0; } REP(i, ile_kabli) { scanf("%d %d %d", &a, &b, &c); a--; b--; c--; kable[a][b] = c; kable[b][a] = c; serwery[a][c]++; serwery[b][c]++; } REP(i, ile_trans) { scanf("%d %d %d", &a, &b, &c); a--; b--; c--; uint wlasc = czy_istnieje(a, b); if (wlasc == NOC) puts("No such cable."); else if (wlasc == c) puts("Already owned."); else if (serwery[a][c] == 2 || serwery[b][c] == 2) puts("Forbidden: monopoly."); else if (znajdz_cykl(a, a, b, c)) puts("Forbidden: redundant."); else { serwery[a][wlasc]--; serwery[b][wlasc]--; serwery[a][c]++; serwery[b][c]++; kable[a][b] = c; kable[b][a] = c; puts("Sold."); } } puts(""); } return 0; }