class Graph:
    def __init__(self, label, extra=None):
        self.name = label 
        self.data = extra 
        self.arcs = []

    def __repr__(self): 
        return self.name

    def satisfies(self, goal):
        return self == goal

    def order(self, path):
        return self.arcs

    def search(self, goal):
        Graph.solns = []
        self.generate([self], goal)
        Graph.solns.sort(lambda x,y: cmp(len(x), len(y)))
        return Graph.solns

    def generate(self, path, goal):
        if self.satisfies(goal):
            Graph.solns.append(path)                       
        else:
            for arc in self.order(path):
                if arc not in path:                    
                    arc.generate(path + [arc], goal)

if __name__ == '__main__': 
    for name in "ABCDEFG":                        # make objects first 
        exec "%s = Graph('%s')" % (name, name)    # label=variable-name
    
    A.arcs = [B, E, G]
    B.arcs = [C]                 # now configure their links:
    C.arcs = [D, E]              # embedded class-instance list
    D.arcs = [F]
    E.arcs = [C, F, G]
    G.arcs = [A]                 

    for (start, stop) in [(A,G), (G,F), (B,A), (D,A)]:  
        print start.search(stop)
