E=enumerate
z=' '
def F(b,g):
if~-b[0].isupper():yield b[0]
for a,*B in g:
if b[0]==a:yield from F(B*(B!=[z])+b[1:],g)
def T(a,g):
q=[(a,b,[])for A,*b in g if A==a]
for A,b,s in q:
for i,j in E(b):
if b[i+1:]and(j==a)>b[i+1].isupper():yield b[i+1]
for J,*k in g:q+=((j==J)>(j in s))*[(J,b[:i]+k*(k!=[z])+b[i+1:],s+[j])]
def f(g):
l,*g=g;D={i[0]:{}for i in g};q,R=['S'],[];l+=z,
for i,(a,*b)in E(g):
for j in(K:=[*F(b,g)]):D[a][j]=i
if' 'in K:
for j in{*T(a,g)}:D[a][j]=i
while q:
a,b=q.pop(0),l.pop(0)
if a!=b:
if~-(a in D):return
q=[t for t in g[D[a][b]][1:]if z!=t]+q;l=[b]+l;R+=D[a][b]+1,
return R
g1 = """
(a+a)
SF
S(S+F)
Fa
"""
g2 ="""
a*(a+a)
STE
E+TE
E
TFU
U*FU
U
F(S)
Fa
"""
g3 = """
aaabbb
SaA
AaAb
Ab
"""
g4 = """
aabbb
SaA
AaAb
Ab
"""
g5 = """
aaabb
SaA
AaAb
Ab
"""
def to_grammar(g):
return [[*i]for i in filter(None, g.split('\n'))]
print(f(to_grammar(g1)))
print(f(to_grammar(g2)))
print(f(to_grammar(g3)))
print(f(to_grammar(g4)))
print(f(to_grammar(g5)))
RT1lbnVtZXJhdGUKej0nICcKZGVmIEYoYixnKToKIGlmfi1iWzBdLmlzdXBwZXIoKTp5aWVsZCBiWzBdCiBmb3IgYSwqQiBpbiBnOgogIGlmIGJbMF09PWE6eWllbGQgZnJvbSBGKEIqKEIhPVt6XSkrYlsxOl0sZykKZGVmIFQoYSxnKToKIHE9WyhhLGIsW10pZm9yIEEsKmIgaW4gZyBpZiBBPT1hXQogZm9yIEEsYixzIGluIHE6CiAgZm9yIGksaiBpbiBFKGIpOgogICBpZiBiW2krMTpdYW5kKGo9PWEpPmJbaSsxXS5pc3VwcGVyKCk6eWllbGQgYltpKzFdCiAgIGZvciBKLCprIGluIGc6cSs9KChqPT1KKT4oaiBpbiBzKSkqWyhKLGJbOmldK2sqKGshPVt6XSkrYltpKzE6XSxzK1tqXSldCmRlZiBmKGcpOgogbCwqZz1nO0Q9e2lbMF06e31mb3IgaSBpbiBnfTtxLFI9WydTJ10sW107bCs9eiwKIGZvciBpLChhLCpiKWluIEUoZyk6CiAgZm9yIGogaW4oSzo9WypGKGIsZyldKTpEW2FdW2pdPWkKICBpZicgJ2luIEs6CiAgIGZvciBqIGlueypUKGEsZyl9OkRbYV1bal09aQogd2hpbGUgcToKICBhLGI9cS5wb3AoMCksbC5wb3AoMCkKICBpZiBhIT1iOgogICBpZn4tKGEgaW4gRCk6cmV0dXJuCiAgIHE9W3QgZm9yIHQgaW4gZ1tEW2FdW2JdXVsxOl1pZiB6IT10XStxO2w9W2JdK2w7Uis9RFthXVtiXSsxLAogcmV0dXJuIFIKIApnMSA9ICIiIgooYSthKQpTRgpTKFMrRikKRmEKIiIiCmcyID0iIiIKYSooYSthKQpTVEUKRStURQpFIApURlUKVSpGVQpVIApGKFMpCkZhCiIiIgoKZzMgPSAiIiIKYWFhYmJiClNhQQpBYUFiCkFiCiIiIgoKZzQgPSAiIiIKYWFiYmIKU2FBCkFhQWIKQWIKIiIiCgpnNSA9ICIiIgphYWFiYgpTYUEKQWFBYgpBYgoiIiIKCmRlZiB0b19ncmFtbWFyKGcpOgoJcmV0dXJuIFtbKmldZm9yIGkgaW4gZmlsdGVyKE5vbmUsIGcuc3BsaXQoJ1xuJykpXQoKCnByaW50KGYodG9fZ3JhbW1hcihnMSkpKQpwcmludChmKHRvX2dyYW1tYXIoZzIpKSkKcHJpbnQoZih0b19ncmFtbWFyKGczKSkpCnByaW50KGYodG9fZ3JhbW1hcihnNCkpKQpwcmludChmKHRvX2dyYW1tYXIoZzUpKSk=
[2, 1, 3, 3]
[1, 4, 8, 5, 7, 1, 4, 8, 6, 2, 4, 8, 6, 3, 6, 3]
[1, 2, 2, 3]
[1, 2, 3]
None