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