#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5+7;
int n, m, k;
vector<int> G[N];
bool vis[N];
int query[N];
int fa[N];
int ans[N];
int cnt;
struct Node{
int u, v;
}e[N];
int find(int x){
while(x ^ fa[x])
x = fa[x] = fa[fa[x]];
return x;
}
void merge(int x, int y){
x = find(x);
y = find(y);
if(x == y)
return;
fa[x] = y;
cnt--;
}
int main(){
cin.tie(0) -> ios::sync_with_stdio(false);
cin >> n >> m;
cnt = 0;
for(int i = 0; i < n; ++i)
fa[i] = i;
for(int i = 1; i <= m; ++i){
cin >> e[i].u >> e[i].v;
G[e[i].u].push_back(e[i].v);
G[e[i].v].push_back(e[i].u);
}
cin >> k;
for(int i = 1; i <= k; ++i){
cin >> query[i];
vis[query[i]] = true;
}
for(int i = 0; i < n; ++i)
if(!vis[i])
cnt++;
for(int i = 1; i <= m; ++i)
if(!vis[e[i].u] && !vis[e[i].v])
merge(e[i].u, e[i].v);
for(int i = k; i >= 1; --i){
ans[i] = cnt;
int u = query[i];
vis[u] = false;
cnt++;
for(int v : G[u])
if(!vis[v])
merge(u, v);
}
cout << cnt << endl;
for(int i = 1; i <= k; ++i)
cout << ans[i] << endl;
return 0;
}