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()