class Two_SAT: """2-SATを定義する. """ #※ i:変数 i が Trueの頂点, i+N:変数 i がFalseの頂点 #入力定義 def __init__(self,N): """N変数の2-SATを考える. """ self.N=N self.clause_number=0 self.adjacent_out=[set() for k in range(2*N)] #出近傍(vが始点) self.adjacent_in=[set() for k in range(2*N)] #入近傍(vが終点) #節の追加 def add_clause(self,X,F,Y,G): """(X=F) or (Y=G) という節を加える. X,Y:変数の名前 F,G:真偽値(True or False) """ assert 0<=XGroup[i+N]: T[i]=1 elif Group[i]==Group[i+N]: return None return T elif Mode==2: return [i for i in range(N) if Group[i]==Group[i+N]] #================================================ import sys from itertools import product input=sys.stdin.readline N,M=map(int,input().split()) E=[] for _ in range(M): C=tuple(map(int,input().split())) E.append(C) K=[["*","*"]] T=Two_SAT(N+1) THREE=[] for i in range(1,N+1): t,*L=map(int,input().split()) L=list(L) if t==1: L.append(-1) T.add_clause(i,0,i,0) elif t==2: L.sort() else: THREE.append(i) L.sort() K.append(L) Cond=[[],[],[]] for a,b,c in E: w=(a in THREE)+(b in THREE) Cond[w].append((a,b,c)) #タイプ0を処理 for a,b,c in Cond[0]: if c==0: for s in [0,1]: for t in [0,1]: if K[a][s]==K[b][t]: T.add_clause(a,1-s,b,1-t) else: H=[x for x in K[a] if x in K[b]] if len(H)==0: #矛盾 T.add_clause(0,0,0,0) T.add_clause(0,1,0,1) elif len(H)==1: h=H[0] s=K[a].index(h) t=K[b].index(h) T.add_clause(a,s,a,s) T.add_clause(b,t,b,t) else: if K[a][0]==K[b][0]: T.add_clause(a,0,b,1) T.add_clause(a,1,b,0) else: T.add_clause(a,0,b,0) T.add_clause(a,1,b,1) Index={THREE[i]:i for i in range(len(THREE))} THREE_COLOR=[K[v] for v in THREE] for U in product(*THREE_COLOR): Flag=True #タイプ2をチェック for a,b,c in Cond[2]: alpha=Index[a] beta =Index[b] if c==0: if U[alpha]==U[beta]: Flag=False break else: if U[alpha]!=U[beta]: Flag=False break if not Flag: continue #タイプ1を追加 A=[] for a,b,c in Cond[1]: if a not in THREE: a,b=b,a if c==0: for s in [0,1]: if U[Index[a]]==K[b][s]: A.append((b,1-s)) else: for s in [0,1]: if U[Index[a]]!=K[b][s]: A.append((b,1-s)) for b,u in A: T.add_clause(b,u,b,u) X=T.Is_Satisfy(1) assert 1 if X: print("Possible") for i in range(1,N+1): if i in THREE: print(U[Index[i]]) else: print(K[i][X[i]]) exit(0) print("Fault")