def dfs_paths(graph, start, goal, path=list()):
    if not path:
        path.append(start)
    if start == goal:
        yield path
    for vertex in graph[start] - set(path):
        yield from dfs_paths(graph, vertex, goal, path=path + [vertex])
graph = {
    'A': set(['B', 'C']),
    'B': set(['A', 'D', 'E']),
    'C': set(['A', 'F']),
    'D': set(['B']),
    'E': set(['B', 'F']),
    'F': set(['C', 'E']),
}
print(repr([path for path in dfs_paths(graph, 'A', 'F')]))
print(repr([path for path in dfs_paths(graph, 'A', 'F')]))
print(repr([path for path in dfs_paths(graph, 'F', 'A')]))
print(repr([path for path in dfs_paths(graph, 'F', 'A')]))
print()
print(repr([path for path in dfs_paths(graph, 'A', 'F', [])]))
print(repr([path for path in dfs_paths(graph, 'A', 'F', [])]))
print(repr([path for path in dfs_paths(graph, 'F', 'A', [])]))
print(repr([path for path in dfs_paths(graph, 'F', 'A', [])]))
