code: def nx_all_simple_edge_paths(G, source, target, cutoff=None, keys=False,
                               data=False):
      
      if cutoff is None:
          cutoff = len(G) - 1
      if cutoff < 1:
          return
      import utool as ut
      import six
      visited_nodes = [source]
      visited_edges = []
      if G.is_multigraph():
          get_neighbs = ut.partial(G.edges, keys=keys, data=data)
      else:
          get_neighbs = ut.partial(G.edges, data=data)
      edge_stack = [iter(get_neighbs(source))]
      while edge_stack:
          children_edges = edge_stack[-1]
          child_edge = six.next(children_edges, None)
          if child_edge is None:
              edge_stack.pop()
              visited_nodes.pop()
              if len(visited_edges) > 0:
                  visited_edges.pop()
          elif len(visited_nodes) < cutoff:
              child_node = child_edge[1]
              if child_node == target:
                  yield visited_edges + [child_edge]
              elif child_node not in visited_nodes:
                  visited_nodes.append(child_node)
                  visited_edges.append(child_edge)
                  edge_stack.append(iter(get_neighbs(child_node)))
          else:
              for edge in [child_edge] + list(children_edges):
                  if edge[1] == target:
                      yield visited_edges + [edge]
              edge_stack.pop()
              visited_nodes.pop()
              if len(visited_edges) > 0:
                  visited_edges.pop()
docs: Returns each path from source to target as a list of edges.
  
      This function is meant to be used with MultiGraphs or MultiDiGraphs.
      When ``keys`` is True each edge in the path is returned with its unique key
      identifier. In this case it is possible to distinguish between different
      paths along different edges between the same two nodes.
  
      Derived from simple_paths.py in networkx