# interact after each solution found

class Silent:
    def found(self, soln): return 1     # 1 means continue
    def final(self): pass 

class Interact:
    def found(self, soln):
        print 'Solution:', soln, 'length:', len(soln)
        answer = raw_input('More? ')                    # after each solution
        return  answer in ['Y', 'y', 'yes', 'Yes']
    def final(self):
        print 'No (more) solutions'                     # end of the search?

silent   = Silent()
interact = Interact()    # make one instance

class Graph:
    mode = silent
    def __init__(self, label, extra=None):
        self.name = label 
        self.data = extra                     
        self.arcs = []

    def __repr__(self): 
        return self.name

    def search(self, goal):
        Graph.solns = []
        if self.generate([self], goal):  
            self.mode.final()
        Graph.solns.sort(lambda x,y: cmp(len(x), len(y)))
        return Graph.solns

    def generate(self, path, goal):
        if self == goal:
            Graph.solns.append(path)                       
            return self.mode.found(path)                       
        else:
            for arc in self.arcs:
                if arc in path:                    
                    continue
                if not arc.generate(path + [arc], goal):
                    return 0
            return 1                              

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]                 

    Graph.mode = interact        # change continue behavior
    A.search(G)
    Graph.mode = silent
    for (start, stop) in [(A,G), (G,F), (B,A), (D,A)]:  
        print start.search(stop)
