from collections import defaultdict class UnionFind: def __init__(self,N,label=None,f=None,weighted=False,rollback=False): self.N=N self.parents=[None]*self.N self.size=[1]*self.N self.roots={i for i in range(self.N)} self.label=label if self.label!=None: self.label=[x for x in label] self.f=f self.weighted=weighted if self.weighted: self.weight=[0]*self.N self.rollback=rollback if self.rollback: self.operate_list=[] self.operate_set=[] def Find(self,x): stack=[] while self.parents[x]!=None: stack.append(x) x=self.parents[x] if not self.rollback: if self.weighted: w=0 for y in stack[::-1]: self.parents[y]=x w+=self.weight[y] self.weight[y]=w else: for y in stack[::-1]: self.parents[y]=x return x def Union(self,x,y,w=None): root_x=self.Find(x) root_y=self.Find(y) if self.rollback: self.operate_list.append([]) self.operate_set.append([]) if root_x==root_y: if self.weighted: if self.weight[y]-self.weight[x]==w: return True else: return False else: if self.size[root_x]w: u,v=v,u route=route[::-1] w=-w G=Graph(N,edges=edges,directed=True,weighted=True) parents=G.SIV_DFS(v,parents=True) route=G.Route_Restoration(v,u,parents=parents) print(len(route)) print(u+1) ans_lst=[m] for x,y in zip(route,route[1:]): ans_lst.append(idx[(x,y)]) print(*[m+1 for m in ans_lst]) exit() else: UF.Union(u,v,w) edges.append((u,v,w)) idx[(u,v)]=m idx[(v,u)]=m print(-1)