#include<iostream> #include<cstdio> #define N 400001 using namespace std; int n,m,d,cnt,tot; int fa[N],q[N],head[N],ans[N]; bool used[N],del[N]; struct edge{ int to,next; }e[N]; inline int find(int x){ return fa[x]==x?x:fa[x]=find(fa[x]); } void insert(int u,int v){ e[++cnt]=(edge){v,head[u]};head[u]=cnt; e[++cnt]=(edge){u,head[v]};head[v]=cnt; } void ins(int x){ int p=find(x),q; for(int i=head[x];i;i=e[i].next){ if(used[e[i].to]){ q=find(e[i].to); if(p!=q)fa[q]=p,tot--; } } } inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int main(){ n=read();m=read(); for(int i=0;i<n;i++)fa[i]=i; for(int i=1;i<=m;i++){ int x=read(),y=read(); insert(x,y); } d=read(); for(int i=1;i<=d;i++){ q[i]=read(); del[q[i]]=1; } for(int i=0;i<n;i++){ if(!del[i]){ tot++; ins(i); used[i]=1; } } ans[d+1]=tot; for(int i=d;i>=1;i--){ tot++; ins(q[i]); used[q[i]]=1; ans[i]=tot; } for(int i=1;i<=d+1;i++) printf("%d\n",ans[i]); return 0; }