1 #include<cstdio>
2 #include<algorithm>
3 const int maxn=4e5+10;
4 const int maxm=2e5+10;
5 int n,m,k,now;
6 int t[maxn],f[maxn],ans[maxn];
7 struct edge{int u,v,time;}e[maxm];
8 bool comp(edge x,edge y){return x.time<y.time;}
9 int find(int k){return f[k]==k?k:f[k]=find(f[k]);}
10 int main(){
11 scanf("%d%d",&n,&m);
12 for(int i=1;i<=n;i++) f[i]=i;
13 for(int i=1;i<=m;i++) scanf("%d%d",&e[i].u,&e[i].v);
14 scanf("%d",&k);
15 int a,b;
16 for(int i=k;i>0;i--){
17 scanf("%d",&a);
18 t[a]=i;
19 }
20 for(int i=1;i<=m;i++) e[i].time=std::max(t[e[i].u],t[e[i].v]);
21 std::sort(e+1,e+m+1,comp);
22 now=n;
23 for(int i=0,j=1;i<=k;i++){
24 while(e[j].time<=i&&j<=m){
25 a=find(e[j].u),b=find(e[j].v);
26 if(a!=b){
27 f[a]=b;
28 now--;
29 }
30 j++;
31 }
32 ans[k-i]=now-k+i;
33 }
34 for(int i=0;i<=k;i++) printf("%d\n",ans[i]);
35 return 0;
36 }