#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
const int N = 5e5 + 10;
int n, m, k;
vector <int> edge[N];
int a[N];
bool is[N];
int fa[N];
int sz[N];
int ans[N];
int rt;
void init()
{
for (int i = 0; i < n; i++)
{
fa[i] = i;
sz[i] = 1;
}
}
int fa_find(int x)
{
if (x == fa[x])return x;
else return fa[x] = fa_find(fa[x]);
}
void fa_union(int x, int y)
{
x = fa_find(x);
y = fa_find(y);
if (x == y)return;
if (sz[x] > 1)rt--;
if (sz[x] > sz[y])swap(x, y);
fa[x] = y;
sz[y] += sz[x];
}
int main()
{
cin >> n >> m;
init();
for (int i = 1; i <= m; i++)
{
int x, y;
cin >> x >> y;
edge[x].push_back(y);
edge[y].push_back(x);
}
cin >> k;
for (int i = 1; i <= k; i++)
{
cin >> a[i];
is[a[i]] = true;
}
for (int i = 0; i < n; i++)
{
if (is[i])continue;
for (int j : edge[i])
{
if (is[j])continue;
fa_union(i, j);
}
}
for (int x = 0; x < n; x++)
{
if (fa[x] == x && !is[x])
{
rt++;
}
}
for (int i = k; i >= 0; i--)
{
ans[i] = rt;
if (!i)break;
is[a[i]] = false;
bool flag = false;
for (int j : edge[a[i]])
{
if (!is[j])
{
fa_union(a[i], j);
flag = true;
}
}
if (!flag)rt++;
}
for (int i = 0; i <= k; i++)
{
cout << ans[i] << endl;
}
return 0;
}