#include <bits/stdc++.h>
using namespace std;
const int N = 400040;
int head[N];
struct edge{
int from, to, next;
}edges[N];
int n, m, tot, k, cnt;
int p[N];
int is_crash[N];
int crash[N];
int ans[N];
int find(int x){
if(p[x] != x)
p[x] = find(p[x]);
return p[x];
}
void merge(int x, int y){
p[find(x)] = find(y);
}
void addedge(int x, int y){
edges[++tot].from = x;
edges[tot].to = y;
edges[tot].next = head[x];
head[x] = tot;
}
int main(void){
scanf("%d%d", &n, &m);
for(int i = 0; i < n; i++)
p[i] = i;
while(m--){
int x, y;
scanf("%d%d", &x, &y);
addedge(x, y);
addedge(y, x);
}
scanf("%d", &k);
for(int i = 0; i < k; i++){
scanf("%d", &crash[i]);
is_crash[crash[i]] = 1;
}
cnt = n - k;
for(int i = 1; i <= 2 * m; i++){
int u = edges[i].from;
int v = edges[i].to;
if(!is_crash[u] && !is_crash[v] && find(u) != find(v)){
cnt--;
merge(u, v);
}
}
ans[k] = cnt;
for(int i = k - 1; i >= 0; i--){
is_crash[crash[i]] = 0;
cnt++;
for(int j = head[crash[i]]; j; j = edges[j].next){
int u = edges[j].from;
int v = edges[j].to;
if(!is_crash[v] && find(u) != find(v)){
cnt--;
merge(u, v);
}
}
ans[i] = cnt;
}
for(int i = 0; i <= k; i++)
printf("%d\n", ans[i]);
return 0;
}