#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
int s[400001];
struct node
{
int n;
node *next;
node(int n)
{
this->n=n;
next=NULL;
}
node()
{
next=NULL;
}
};
node head[400001],*tail[400001];
int b[400001];
bool g[400001];
bool cnt[400001];
int ans[400001];
int my_find(int x)
{
if(s[x]==x)
return x;
return s[x]=my_find(s[x]);
}
void my_union(int x,int y)
{
s[my_find(y)]=my_find(x);
}
int main()
{
memset(cnt,0,sizeof(cnt));
memset(g,true,sizeof(g));
int n,m,x,y;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
s[i]=i;
tail[i]=&head[i];
}
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
tail[x]->next=new node(y);
tail[y]->next=new node(x);
tail[x]=tail[x]->next;
tail[y]=tail[y]->next;
}
int k;
scanf("%d",&k);
for(int i=1;i<=k;i++)
{
scanf("%d",&b[i]);
g[b[i]]=0;
}
for(int i=0;i<n;i++)
{
if(g[i]==false)
continue;
node *p=&head[i];
while(p->next!=NULL)
{
p=p->next;
if(g[p->n]==false)
continue;
my_union(p->n,i);
}
}
int sum=0;
for(int i=0;i<n;i++)
if(cnt[my_find(s[i])]==false)
{
sum++;
cnt[my_find(s[i])]=true;
}
sum-=k;
ans[k]=sum;
int tmp=-1,w;
for(int i=k;i>=1;i--)
{
tmp=-1;
w=b[i];
g[w]=true;
node *p=&head[w];
while(p->next!=NULL)
{
p=p->next;
if(g[p->n]==false)
continue;
if(my_find(p->n)!=my_find(w))
{
tmp++;
my_union(p->n,w);
}
}
sum-=tmp;
ans[i-1]=sum;
}
for(int i=0;i<=k;i++)
printf("%d\n",ans[i]);
return 0;
}