<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def node_intersection(graphs):
 """Take the node intersection over a collection of graphs into a new graph. This intersection is defined the same way as by :func:`left_node_intersection_join` :param iter[BELGraph] graphs: An iterable of graphs. Since it's iterated over twice, it gets converted to a tuple first, so this isn't a safe operation for infinite lists. :rtype: BELGraph Example usage: """

    graphs = tuple(graphs)

    n_graphs = len(graphs)

    if n_graphs == 0:
        raise ValueError('no graphs given')

    if n_graphs == 1:
        return graphs[0]

    nodes = set(graphs[0].nodes())

    for graph in graphs[1:]:
        nodes.intersection_update(graph)

    return union(
        subgraph(graph, nodes)
        for graph in graphs
    )