vertexes = set('abcdefgh')
childs = {'a': 'b', 'b': 'cef', 'c': 'dg', 'd': 'ch',
'e': 'af', 'f': 'g', 'g': 'f', 'h': 'dg'}
parents = {v: [] for v in vertexes}
for v, uu in childs.items():
for u in uu:
parents[u].append(v)
res = []
while vertexes:
seed = vertexes.pop()
tplus, tminus = {seed}, {seed}
for t, links in zip([tplus, tminus], [childs, parents]):
nxt = t
visited = set()
while nxt:
cur, nxt = nxt, set()
for v in cur:
if v in visited:
continue
visited.add(v)
for u in links[v]:
nxt.add(u)
t.update(nxt)
tplus &= tminus
res.append(''.join(sorted(tplus)))
vertexes -= tplus
print(res)