#include #include #include #include #include #include #include #include #include #include using namespace std; #define ll long long int a[200][200]; int c[200]; int elim[200]; int elim_rev[200]; int main( void ) { map< string, int > dic; dic["MON"] = 0; dic["TUE"] = 1; dic["WED"] = 2; dic["THU"] = 3; dic["FRI"] = 4; dic["SAT"] = 5; dic["SUN"] = 6; FILE *in = fopen( "factory.in", "r" ); while( 1 ){ int n, m; fscanf( in, "%d%d", &n, &m ); if( n == 0 && m == 0 ) break; for( int i = 0; i < m; i ++ ){ int s; char f[32], t[32]; fscanf( in, "%d%s%s", &s, f, t ); int F = dic[f]; int T = dic[t]; a[i][n] = (T - F + 8) % 7; for( int j = 0; j < n; j ++ ) a[i][j] = 0; for( int j = 0; j < s; j ++ ){ int k; fscanf( in, "%d", &k ); k --; a[i][k] ++; a[i][k] %= 7; } elim[i] = -1; } int phase = min( n, m ); int res = -1; int is_multiple = 0; for( int p = 0; p < n; p ++ ){ /* printf( "p = %d +++++\n", p ); for( int i = 0; i < m; i ++ ){ for( int j = 0; j < n + 1; j ++ ) printf( "%d ", a[i][j] ); printf( "\n" ); } */ int pv = -1; for( int i = 0; i < m; i ++ ){ if( elim[i] < 0 && a[i][p] > 0 ){ pv = i; break; } } // printf( "pv = %d\n", pv ); if( pv < 0 ) // all 0 is_multiple = 1; else{ elim[pv] = p; elim_rev[p] = pv; int AA = a[pv][p]; for( int i = 0; i < m; i ++ ){ if( i == pv ) continue; int BB = a[i][p]; if( BB == 0 ) continue; for( int j = 0; j <= n; j ++ ) a[i][j] = (a[i][j] * AA - a[pv][j] * BB + 700000) % 7; } } // else } // p /* for( int i = 0; i < m; i ++ ){ for( int j = 0; j < n + 1; j ++ ) printf( "%d ", a[i][j] ); printf( "\n" ); } */ // done int flag_inc = 0; for( int i = 0; i < m; i ++ ){ if( elim[i] < 0 && a[i][n] != 0 ) flag_inc = 1; } if( flag_inc ) printf( "Inconsistent data.\n" ); else if( is_multiple ) printf( "Multiple solutions.\n" ); else{ for( int p = n - 1; p >= 0; p -- ){ int pv = elim_rev[p]; int k; for( k = 0; k < 7; k ++ ) if( a[pv][p] * k % 7 == a[pv][n] ) break; c[p] = k; } for( int p = 0; p < n; p ++ ){ printf( "%d%s", (c[p] + 4) % 7 + 3, p == n - 1 ? "\n" : " " ); } } } return 0; }