Вы можете использовать рекурсию с генератором:
d = {'A': [1, 2, 3, 4], 'B': [4, 5, 6, 7], 'C': [7, 8, 9, 10]}
def find_path(start, end, c = [], seen = []):
_r = [a for a, b in d.items() if any(i in b for i in d[start]) and a not in seen]
if end in _r:
yield c+[end]
else:
for i in _r:
yield from find_path(i, end, c = c+[i], seen=seen+[start])
print(min(find_path('A', 'C', c = ['A']), key=len))
Выход:
['A', 'B', 'C']
Это будет работать на большем входе:
d = {'A': [1, 2, 3, 4], 'B': [4, 5, 6, 7], 'C': [7, 8, 9, 10], 'D':[30, 45, 23], 'F':[10, 11, 12, 13], 'G':[13, 14, 15]}
print(min(find_path('A', 'G', c = ['A'], seen=['A']), key=len))
Выход:
['A', 'B', 'C', 'F', 'G']