#include<bits/stdc++.h>
using namespace std;
const int N = 4e6 + 10;
int n, m, fa[N], head[N], tot, k, brk[N], total, ans[N];
bool flag[N];
struct IOI{
int next, node, from;
}a[N];
int find(int x){
if(fa[x] == x)
return x;
else
return fa[x] = find(fa[x]);
}
int kkk(int u, int v){
if(find(v) != find(u))
fa[find(v)] = find(u);
}
void init(){
cin >> n >> m;
for(int i = 0; i < n; i++){
fa[i] = i;
head[i] = -1;
}
}
void add(){
for(int i = 1; i <= m; i++){
int x, y;
cin >> x >> y;
a[++tot].from = x;
a[tot].next = head[x];
head[x] = tot;
a[tot].node = y;
a[++tot].from = y;
a[tot].next = head[y];
head[y] = tot;
a[tot].node = x;
}
}
void init2(){
cin >> k;
for(int i = 1; i <= k; i++){
cin >> brk[i];
flag[brk[i]] = 1;
}
total = n - k;
}
void jibian(){
for(int i = 1; i <= 2 * m; i++){
if(!flag[a[i].from] && !flag[a[i].node] && find(a[i].from) != find(a[i].node)){
total--;
kkk(a[i].from, a[i].node);
}
}
}
void xiujian(){
ans[k + 1] = total;
for(int i = k; i >= 1; i--){
total++;
flag[brk[i]] = 0;
for(int j = head[brk[i]]; j != -1; j = a[j].next){
if(!flag[a[j].node] && find(brk[i]) != find(a[j].node)){
total--;
kkk(brk[i], a[j].node);
}
}
ans[i] = total;
}
}
void answer(){
for(int i = 1; i <= k + 1; i++)
cout << ans[i] << endl;
}
signed main(){
init();
add();
init2();
jibian();
xiujian();
answer();
return 0;
}