def _push(node):
    """
    Push load away from the current node if possible.

    If a neighboring node which is "closer" to the target can accept more load
    push it to the node. If no such node is found push fails meaning a relabel has
    to be executed.
    """
    success = False
    for edge in node.outgoing_edges():
        neighbor = edge.destination()
        if not node.dist == neighbor.dist + 1 or edge.load == edge.capacity:
            continue
        success = True
        reverse_edge = node.edge_from(neighbor)

        push = min(edge.capacity - edge.load, node.overrun)
        edge.load         += push
        reverse_edge.load -= push
        neighbor.overrun  += push
        node.overrun      -= push

        print("[*] pushing %i from %s to %s" % (push, node.name(), neighbor.name()))

        if node.overrun == 0:
            break

    return success