#include "bits/stdc++.h"
using namespace std;
using ll = long long;
using ld = long double;
using ull = unsigned long long;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
// https://codeforces.com/blog/entry/79148
class Timer: chrono::high_resolution_clock {
const time_point start_time;
public:
Timer(): start_time(now()) {}
rep elapsed_time() const {
return chrono::duration_cast<chrono::milliseconds>(now() - start_time).count();
}
} timer;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int n, m, q;
cin >> n >> m >> q;
vector<vector<pair<int, int>>> graph(n + 1);
vector<int> dist(n + 1), queries(q);
vector<pair<int, int>> edges(m + 1);
vector<bool> vis(n + 1, 0), good(m + 1, 1);
for (int i = 1; i <= m; i++) {
auto &[u, v] = edges[i];
cin >> u >> v;
graph[u].push_back({v, i});
graph[v].push_back({u, i});
}
queue<int> qu;
qu.push(1);
vis[1] = 1;
dist[1] = 0;
while (qu.size()) {
int u = qu.front();
qu.pop();
for (auto &[v, _] : graph[u]) {
if (!vis[v]) {
qu.push(v);
dist[v] = dist[u] + 1;
vis[v] = 1;
}
}
}
for (int i = 0; i < q; i++) {
cin >> queries[i];
good[queries[i]] = 0;
}
int ans = n - 1;
vis = vector<bool>(n + 1, 0);
vis[1] = 1;
auto upd = [&] (auto self, int u)->void {
ans--;
vis[u] = 1;
for (auto &[v, id] : graph[u]) {
if (dist[v] == dist[u] + 1 && good[id] && !vis[v]) {
self(self, v);
}
}
};
for (int i = 1; i <= m; i++) {
if (good[i]) {
auto &[u, v] = edges[i];
if (dist[u] > dist[v]) {
swap(u, v);
}
if (dist[v] > dist[u] && vis[u]) {
upd(upd, v);
}
}
}
vector<int> res;
res.push_back(ans);
for (int i = q - 1; i; i--) {
good[queries[i]] = 1;
auto &[u, v] = edges[queries[i]];
if (dist[u] > dist[v]) {
swap(u, v);
}
if (dist[v] > dist[u] && vis[u]) {
upd(upd, v);
}
res.push_back(ans);
}
reverse(res.begin(), res.end());
for (auto &x : res) {
cout << x << "\n";
}
return 0;
}