// // File: regulate.cc // Author: cteam18 // // Created on November 13, 2011, 12:30 PM // #include #include #include #include #include #include #include #include #include using namespace std; typedef vector vb; typedef set si; typedef set::iterator itsi; typedef pair pii; struct Ceg{ vector > elek; vector volte; // int n; Ceg() :elek(8000){ } void print(){ for(int j = 0; j < 3; ++j){ printf("%d (%d db) szomszedjai:", j, elek[j].size()); for(itsi i = elek[j].begin(); i != elek[j].end(); ++i) printf(" %d", *i); printf("\n"); } } void clear(int n){ for(int i = 0; i < n; ++i) elek[i].clear(); // print(); } void vettel(int v1, int v2){ elek[v1].erase(v2); elek[v2].erase(v1); } void addel(int v1, int v2){ elek[v1].insert(v2); elek[v2].insert(v1); } int fokszam(int v){ // printf("%d (%d db) szomszedjai:", v, elek[v].size()); // for(itsi i = elek[v].begin(); i != elek[v].end(); ++i) // printf(" %d", *i); // printf("\n"); return elek[v].size(); } bool bejar(int v, int honnan){ for(itsi i = elek[v].begin(); i != elek[v].end(); ++i){ if(*i != honnan && volte[*i]) return true; volte[*i] = true; if(bejar(*i, v)) return true; } return false; } bool cyclic(int v1, int v2){ volte = vb(8000, false); volte[v1] = true; volte[v2] = true; return bejar(v2, v1); } }; int main(int argc, char** argv) { Ceg cegs[100]; map elek; int n, m, c, t, s1, s2, k; scanf("%d%d%d%d", &n, &m, &c, &t); while(n || m || c || t){ elek.clear(); for(int i = 0; i < c; ++i) cegs[i].clear(n); for(int i = 0; i < m; ++i){ scanf("%d%d%d", &s1, &s2, &k); --s1; --s2; --k; cegs[k].addel(s1, s2); elek[pii(s1, s2)] = k; elek[pii(s2, s1)] = k; } // for(int i = 0; i < c; ++i) // cegs[c].print(); // cegs[2].fokszam(0); for(int i = 0; i < t; ++i){ scanf("%d%d%d", &s1, &s2, &k); --s1; --s2; --k; if(elek.count(pii(s1, s2))){ if(elek[pii(s1, s2)] == k){ printf("Already owned.\n"); } else { if(cegs[k].fokszam(s1) > 1 || cegs[k].fokszam(s2) > 1){ printf("Forbidden: monopoly.\n"); } else { if(cegs[k].cyclic(s1, s2)){ printf("Forbidden: redundant.\n"); } else { cegs[elek[pii(s1, s2)]].vettel(s1, s2); cegs[k].addel(s1, s2); elek[pii(s1, s2)] = k; elek[pii(s2, s1)] = k; printf("Sold.\n"); } } } } else { printf("No such cable.\n"); } } printf("\n"); scanf("%d%d%d%d", &n, &m, &c, &t); } return (0); }