// Slower C++ solution:
#include<iostream>

#include<queue>

using namespace std;

#pragma warning(disable:4996)

int n, m, q, dist[110000], mark[110000], u[210000], v[210000];

vector<pair<int, int>>x[110000], y[110000], z[110000]; bool used[210000];

bool isgood(int f) {

	for (int i = 0; i < z[f].size(); i++) {

		if (mark[z[f][i].first] == 0 && used[z[f][i].second] == false)return true;

	}

	return false;

}

int main() {

	scanf("%d%d%d", &n, &m, &q); queue<int>Q;

	for (int i = 0; i < m; i++) {

		int a, b; scanf("%d%d", &a, &b); u[i + 1] = a; v[i + 1] = b;

		x[a].push_back(make_pair(b, i + 1)); x[b].push_back(make_pair(a, i + 1));

	}

	Q.push(1); for (int i = 1; i <= n; i++)dist[i] = 999999; dist[1] = 0;

	while (!Q.empty()) {

		int a1 = Q.front(); Q.pop();

		for (int i = 0; i < x[a1].size(); i++) {

			if (dist[x[a1][i].first] > dist[a1] + 1) { dist[x[a1][i].first] = dist[a1] + 1; Q.push(x[a1][i].first); }

		}

	}

	for (int i = 1; i <= n; i++) {

		for (int j = 0; j < x[i].size(); j++) {

			if (dist[i] < dist[x[i][j].first]) { y[i].push_back(x[i][j]); }

			if (dist[i] > dist[x[i][j].first]) { z[i].push_back(x[i][j]); }

		}

	}

	int cnt = 0;

	for (int i = 0; i < q; i++) {

		int a; scanf("%d", &a); used[a] = true;

		int E1 = u[a], E2 = v[a];

		if (dist[E1] == dist[E2]) { cnt += 0; }

		else {

			int a1 = 0; if (dist[E1] < dist[E2])a1 = E2; else a1 = E1;

			if (isgood(a1) == false && mark[a1] == 0) {

				queue<int>Q; Q.push(a1); cnt++; mark[a1] = 1;

				while (!Q.empty()) {

					int a2 = Q.front(); Q.pop();

					for (int j = 0; j < y[a2].size(); j++) {

						if (mark[y[a2][j].first] == 0 && isgood(y[a2][j].first) == false) {

							mark[y[a2][j].first] = 1; Q.push(y[a2][j].first); cnt++;

						}

					}

				}

			}

		}

		printf("%d\n", cnt);

	}

	return 0;

}

// Faster C++ solution for the same problem (measured speedup: 1.1030123991612453x):
//-------------------------------------------

//-               Train Fare                -

//-                                         -

//-       autumn_eel niha katemasen!        -

//-------------------------------------------

#include<iostream>

#include<functional>

#include<queue>

#include<vector>

#include<algorithm>

using namespace std;

#pragma warning(disable:4996)

int n, m, q, a[200001], b[200001], c[200001], d[200001], e[100001], dist[100001], E[200001];

vector<pair<int, int>>x[100001], z[100001];

vector<int>D[100001];

void reader(int *x) {

	int k = getchar(); *x = k - '0';

	while (true) {

		k = getchar();

		if (k < '0' || k > '9') break;

		*x = ((*x) << 1) + ((*x) << 3) + k - '0';

	}

}

int main() {

	reader(&n); reader(&m); reader(&q);

	fill(d, d + m + 1, 1 << 30);

	for (int i = 1; i <= m; i++) reader(&a[i]), reader(&b[i]);

	for (int i = 1; i <= q; i++) reader(&c[i]), d[c[i]] = i;

	for (int i = 1; i <= m; i++) {

		x[a[i]].push_back(make_pair(b[i], d[i]));

		x[b[i]].push_back(make_pair(a[i], d[i]));

	}

	fill(dist, dist + n + 1, -1); dist[1] = 0;

	queue<int> Q1; Q1.push(1);

	while (!Q1.empty()) {

		int a1 = Q1.front(); Q1.pop();

		for (pair<int, int> i : x[a1]) {

			if (dist[i.first] == -1) {

				dist[i.first] = dist[a1] + 1;

				Q1.push(i.first);

			}

		}

	}

	for (int i = 1; i <= n; i++) {

		D[dist[i]].push_back(i);

		for (pair<int, int> j : x[i]) {

			if (dist[i] > dist[j.first]) z[i].push_back(j);

		}

	}

	e[1] = (1 << 30);

	for (int i = 1; i < n; i++) {

		for (int j : D[i]) {

			for (pair<int, int>k : z[j]) {

				e[j] = max(e[j], min(e[k.first], k.second));

			}

		}

	}

	for (int i = 2; i <= n; i++) { if (e[i] < 300000)E[e[i]]++; }

	for (int i = 1; i <= q; i++)E[i] += E[i - 1];

	for (int i = 1; i <= q; i++) {

		printf("%d\n", E[i]);

	}

	return 0;

}