#include #include #include #include #include using namespace std; using namespace std::tr1; void go(int n, int m, int cc, int t) { map, int> vlast; vector > > sused(n+2, vector >(cc+2)); for (int i = 0; i < m; i++) { int a, b, c; scanf("%d %d %d", &a, &b, &c); sused[a][c].insert(b); sused[b][c].insert(a); vlast[make_pair(a,b)] = c; vlast[make_pair(b,a)] = c; } for (int i = 0; i < t; i++) { int a, b, c; scanf("%d %d %d", &a, &b, &c); if (vlast.count(make_pair(a,b)) == 0) { printf("No such cable.\n"); continue; } if (vlast[make_pair(a,b)] == c) { printf("Already owned.\n"); continue; } if (sused[a][c].size() == 2 || sused[b][c].size() == 2) { printf("Forbidden: monopoly.\n"); continue; } if (sused[a][c].size() == 1 && sused[b][c].size() == 1) { int last = 0; int cur = a; while (true) { int nn = 0; for (unordered_set::iterator it = sused[cur][c].begin(); it != sused[cur][c].end(); ++it) { if (*it == last) continue; nn = *it; } if (nn == 0) break; last = cur; cur = nn; } if (cur == b) { printf("Forbidden: redundant.\n"); continue; } } printf("Sold.\n"); int pov = vlast[make_pair(a,b)]; sused[a][pov].erase(b); sused[b][pov].erase(a); sused[a][c].insert(b); sused[b][c].insert(a); vlast[make_pair(a,b)] = c; vlast[make_pair(b,a)] = c; } printf("\n"); } int main() { while (true) { int n, m, c, t; scanf("%d %d %d %d", &n, &m, &c, &t); if (n==0) break; go(n, m, c, t); } }