#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 7;
const int M = 3e4 + 7;
const long long mod = 1e9 + 7;
#define up(i,l,r) for(int i=l;i<=r;i++)
#define dn(i,l,r) for(int i=l;i>=r;i--)
#define mms(k,p) memset(k,p,sizeof(k))
#define pr(c) printf("%lld\n",c)
ll n, m, ans[N], res;
ll f[N], sp[N], remb[N];
ll k;
struct node {
ll v;
};
vector<node>g[N];
void add(ll x, ll y) {
g[x].push_back({ y });
}
int find(ll x) {
if (x == f[x])return x;
return f[x] = find(f[x]);
}
void mer(ll x, ll y) {
ll a = find(x), b = find(y);
f[a] = b;
}
int main() {
cin >> n >> m;
up(i, 1, m) {
ll a, b;
scanf("%lld%lld", &a, &b);
add(a, b), add(b, a);
}
up(i, 1, n) {
f[i] = i;
}
cin >> k;
up(i, 1, k) {
ll x;
scanf("%lld", &remb[i]);
sp[remb[i]] = 1;
}
res = n - k;
up(i, 0, n-1) {
for (auto nv : g[i])
if (!sp[i] && !sp[nv.v] && f[i] != f[nv.v]) {
res--;
mer(i, nv.v);
}
}
ans[k ] = res;
dn(i, k-1, 0) {
ll x = remb[i+1];
res++;
sp[x] = 0;
for (auto nv : g[x])
{
ll v1 = nv.v;
ll a = find(x), b = find(v1);
if (!sp[v1] && a != b)
{
res--;
mer(x, v1);
}
}
ans[i] = res;
}
up(i, 0, k ) {
pr(ans[i]);
}
}