#include <bits/stdc++.h>
#include <experimental/random>
#include <random>
//#include <ext/pb_ds/assoc_container.hpp>
//using namespace __gnu_pbds;
using namespace std;
using ld = long double;
using ll = long long;
const ll INF = 1e18, MOD = 1e9 + 7;
void solve();
signed main() {
#ifdef LOCAL
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
ios::sync_with_stdio(false);
cin.tie(0);
int q = 1;
//cin >> q;
while (q--) {
solve();
}
}
vector<ll> p, sz;
ll get(ll x) {
if (p[x] == x) return p[x];
p[x] = get(p[x]);
return p[x];
}
void join(ll x, ll y) {
x = get(x), y = get(y);
if (x == y) return;
sz[x] += sz[y];
p[y] = x;
}
void solve() {
ll n, m, q;
cin >> n >> m >> q;
p.resize(n), sz.resize(n, 1);
iota(p.begin(), p.end(), 0);
vector<vector<ll>> g(n);
vector<pair<ll, ll>> edges;
for (int i = 0; i < m; i++) {
ll a, b; cin >> a >> b; a--, b--;
g[a].push_back(b);
g[b].push_back(a);
edges.emplace_back(a, b);
}
queue<ll> bfs; bfs.push(0);
vector<ll> dist(n, -1); dist[0] = 0;
while (!empty(bfs)) {
ll v = bfs.front(); bfs.pop();
for (auto u : g[v]) {
if (dist[u] == -1) {
dist[u] = dist[v] + 1;
bfs.emplace(u);
}
}
}
vector<ll> add, del(m);
for (int i = 0; i < q; i++) {
ll id; cin >> id; id--; add.push_back(id); del[id] = 1;
}
reverse(add.begin(), add.end());
vector<ll> hv(m);
for (int i = 0; i < m; i++) {
auto [a, b] = edges[i];
if (dist[a] == dist[b] + 1 || dist[b] == dist[a] + 1) {
hv[i] = 1;
if (del[i]) continue;
join(a, b);
}
}
vector<ll> ans(q);
for (int i = 0; i < q; i++) {
ans[q - i - 1] = n - sz[get(0)];
if (hv[add[i]]) join(edges[add[i]].first, edges[add[i]].second);
}
for (int i = 0; i < q; i++) cout << ans[i] << '\n';
}