// // File: regulate.cc // Author: cteam03 // // Created on November 13, 2011, 9:42 AM // #include #include // // // class Node { public: Node *next[200]; Node() { for (int i = 0; i < 200; i++) { next[i] = NULL; } } }; bool iterate(int c, Node* from, Node *end, Node *now) { if (now == NULL) return true; if (now == end) return false; if (from != now->next[c - 1]) return iterate(c, now, end, now->next[c - 1]); else return iterate(c, now, end, now->next[c - 1 + 100]); } int main(int argc, char** argv) { int N, M, C, T; scanf("%d%d%d%d", &N, &M, &C, &T); while (N != 0 && M != 0 && C != 0 && T != 0) { Node **nodes; nodes = new Node*[N]; for (int i = 0; i < N; i++) { nodes[i] = new Node(); } for (int i = 0; i < M; i++) { int a, b, t; scanf("%d%d%d", &a, &b, &t); if (nodes[a - 1]->next[t - 1] == NULL) { nodes[a - 1]->next[t - 1] = nodes[b - 1]; } else { nodes[a - 1]->next[t - 1 + 100] = nodes[b - 1]; } if (nodes[b - 1]-> next[t - 1] == NULL) { nodes[b - 1]->next[t - 1] = nodes[a - 1]; } else { nodes[b - 1]->next[t - 1 + 100] = nodes[a - 1]; } } for (int i = 0; i < T; i++) { int a, b, c; scanf("%d%d%d", &a, &b, &c); bool iscable = false; int own = -1; for (int j = 0; j < 200; j++) { if (nodes[a - 1]->next[j] == nodes[b - 1]) { iscable = true; own = j; } } if (!iscable) { printf("No such cable.\n"); } else if(nodes[a - 1]->next[c - 1] == nodes[b - 1] || nodes[a - 1]->next[c - 1 + 100] == nodes[b - 1]) { printf("Already owned.\n"); } else if((nodes[a - 1]->next[c - 1] != NULL && nodes[a - 1]->next[c - 1 + 100] != NULL) || (nodes[b - 1]->next[c - 1] != NULL && nodes[b - 1]->next[c -1 + 100] != NULL)) { printf("Forbidden: monopoly.\n"); } else { bool r = iterate(c, NULL, nodes[b - 1], nodes[a - 1]); if (r) { nodes[a - 1]->next[own] = NULL; if (nodes[b - 1]->next[own] == nodes[a - 1]) nodes[b - 1]->next[own] = NULL; else nodes[b - 1]->next[(own + 100) % 100] = NULL; if (nodes[a - 1]->next[c - 1] == NULL) { nodes[a - 1]->next[c - 1] = nodes[b - 1]; } else { nodes[a - 1]->next[c - 1 + 100] = nodes[b - 1]; } if (nodes[b - 1]-> next[c - 1] == NULL) { nodes[b - 1]->next[c - 1] = nodes[a - 1]; } else { nodes[b - 1]->next[c - 1 + 100] = nodes[a - 1]; } printf("Sold.\n"); } else { printf("Forbidden: redundant.\n"); } } } printf("\n"); scanf("%d%d%d%d", &N, &M, &C, &T); } return 0; }