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