import sys sys.setrecursionlimit(10**7) def input(): return sys.stdin.readline().strip() class Node: __slots__ = ('parent', 'size') def __init__(self): self.parent = None self.size = 1 def find(x: Node) -> Node: path = [] while x.parent: path.append(x) x = x.parent result = x for x in path: x.parent = result return result def union(x: Node, y: Node) -> None: px = find(x) py = find(y) if px is py: return if px.size > py.size: py.parent = px px.size += py.size else: px.parent = py py.size += px.size def main(): N, M = map(int, input().split()) edge: list[tuple[int, int]] = [] for _ in range(M): u, v = map(int, input().split()) edge.append((u-1, v-1)) edgeset = set(range(M)) B = [] Q = int(input()) for _ in range(Q): i = int(input()) B.append(i-1) edgeset -= {i-1} node = [Node() for _ in range(N)] ans = [0] * Q for i in edgeset: if find(node[edge[i][0]]) is not find(node[edge[i][1]]): ans[Q-1] += find(node[edge[i][0]]).size * find(node[edge[i][1]]).size union(node[edge[i][0]], node[edge[i][1]]) for i, j in enumerate(reversed(B[1:]), start=2): ans[Q-i] = ans[Q-i+1] if find(node[edge[j][0]]) is not find(node[edge[j][1]]): ans[Q-i] += find(node[edge[j][0]]).size * find(node[edge[j][1]]).size union(node[edge[j][0]], node[edge[j][1]]) for i in range(Q): print((N-1) * N // 2 - ans[i]) if __name__ == '__main__': main()