#include #include #include #include using namespace std; int connection[8000][8000]; int serverCableCount[8000][100]; int serversCount; bool connected(int s1, int s2, int k) { if ( serverCableCount[s1][k] == 0 ) return false; if ( serverCableCount[s2][k] == 0 ) return false; bool met[8000]; memset( met, false, sizeof met); int serverList[8000]; int marker = 0; int next = 1; serverList[0] = s1; met[s1] = true; while ( marker < next ) { int currentServer = serverList[marker]; if ( connection[currentServer][s2] == k ) return true; for ( int i = 0; i < serversCount; i++ ) if ( ( !met[i] ) && ( connection[ currentServer][i] == k ) ) { serverList[next] = i; met[i] = true; next++; } marker++; } return false; } int main() { int n,m,c,t; scanf( "%d%d%d%d", &n, &m, &c, &t ); while ( ( n != 0 ) || ( m!= 0 ) || ( c != 0 ) || ( t != 0 ) ) { serversCount = n; memset( connection, -1 , sizeof connection ); memset( serverCableCount, 0, sizeof serverCableCount ); for ( int i = 0; i < m; i++ ) { int s1,s2,k; scanf( "%d%d%d", &s1, &s2, &k ); s1--; s2--; connection[s1][s2] = k; connection[s2][s1] = k; serverCableCount[s1][k]++; serverCableCount[s2][k]++; } for ( int i = 0; i < t; i++ ) { int s1, s2, k; scanf( "%d%d%d", &s1, &s2, &k ); s1--; s2--; if ( connection[s1][s2] == -1 ) { printf("No such cable\n"); continue; } if ( connection[s1][s2] == k ) { printf("Already owned.\n"); continue; } if ( ( serverCableCount[s1][k] == 2 ) || ( serverCableCount[s2][k] == 2 ) ) { printf("Forbidden: monopoly.\n"); continue; } if ( connected(s1,s2,k) ) { printf("Forbidden: redundant.\n"); continue; } int oldComp = connection[s1][s2]; serverCableCount[s1][oldComp] --; serverCableCount[s2][oldComp] --; connection[s1][s2] = connection[s2][s1] = k; serverCableCount[s1][k] ++; serverCableCount[s2][k] ++; printf("Sold.\n"); } printf("\n"); scanf( "%d%d%d%d", &n, &m, &c, &t ); } }