#include #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]; bool znajdz_cykl(uint gdzie, uint skad, uint co, byte kto) { FOREACH(i, kable[gdzie]) if (i->first != skad && i->second == kto && (i->first == co || znajdz_cykl(i->first, gdzie, co, kto))) return true; return false; } uint czy_istnieje(uint a, uint b) { FOREACH(i, kable[a]) if (i->first == b) return i->second; return NOC; } 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(c, 100) serwery[i][c] = 0; } REP(i, ile_kabli) { scanf("%d %d %d", &a, &b, &c); a--; b--; c--; kable[a].push_back(make_pair(b, c)); kable[b].push_back(make_pair(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]++; FOREACH(j, kable[a]) if (j->first == b) { j->second = c; break; } FOREACH(j, kable[b]) if (j->first == a) { j->second = c; break; } puts("Sold."); } } puts(""); } return 0; }