stablegradients/pie-gem5-pairs huggingface dataset:
// Slower C++ solution:
#include<bits/stdc++.h>

#define rep(i,n)for(int i=0;i<n;i++)

using namespace std;



void reader(int *x) {

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

	while (1) {

		k = getchar_unlocked();

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

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

	}

}

vector<int>E[100000];

int u[200000], v[200000], r[200000], ans[200000], d[100000], cnt = 1;

bool b[200000], ok[100000];

queue<int>que;



void bfs(int u, int t) {

	que.push(u);

	while (!que.empty()) {

		int p = que.front(); que.pop(); for (int v : E[p]) {

			if (t) {

				if (d[v] > d[p] && !ok[v]) {

					ok[v] = 1; cnt++; que.push(v);

				}

			}

			else if (!~d[v]) {

				d[v] = d[p] + 1; que.push(v);

			}

		}

	}

}

int main() {

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

	rep(i, m) {

		reader(&u[i]); reader(&v[i]);

		u[i]--; v[i]--;

		E[u[i]].push_back(v[i]); E[v[i]].push_back(u[i]);

	}

	queue<int>que;

	memset(d, -1, sizeof(d));

	d[0] = 0; bfs(0, 0);

	rep(i, m) {

		if (d[u[i]] > d[v[i]])swap(u[i], v[i]);

	}

	rep(i, n)E[i].clear();

	rep(i, q) {

		reader(&r[i]); r[i]--;

		b[r[i]] = true;

	}

	ok[0] = true;

	rep(i, m) {

		if (!b[i]) {

			if (d[v[i]] - d[u[i]] == 1) {

				E[u[i]].emplace_back(v[i]);

			}

		}

	}

	bfs(0, 1);

	for (int i = q - 1; i >= 0; i--) {

		ans[i] = n - cnt;

		if (d[v[r[i]]] - d[u[r[i]]] == 1 && !ok[v[r[i]]]) {

			E[u[r[i]]].emplace_back(v[r[i]]);

			if (ok[u[r[i]]]) {

				cnt++; ok[v[r[i]]] = true;

				bfs(v[r[i]], 1);

			}

		}

	}

	rep(i, q)printf("%d\n", ans[i]);

}

// Faster C++ solution for the same problem (measured speedup: 1.1182113781991307x):
#include<bits/stdc++.h>

#define rep(i,n)for(int i=0;i<(n);i++)

#define mygc(c) (c)=getchar_unlocked()

#define mypc(c) putchar_unlocked(c)

void reader(int& x) { int k, m = 0; x = 0; for (;;) { mygc(k); if (k == '-') { m = 1; break; }if ('0' <= k&&k <= '9') { x = k - '0'; break; } }for (;;) { mygc(k); if (k<'0' || k>'9')break; x = x * 10 + k - '0'; }if (m) x = -x; }

void writer(int x, char c) { int s = 0, m = 0; char f[10]; if (x<0)m = 1, x = -x; while (x)f[s++] = x % 10, x /= 10; if (!s)f[s++] = 0; if (m)mypc('-'); while (s--)mypc(f[s] + '0'); mypc(c); }

using namespace std;

typedef pair<int, int>P;



vector<P>E[100000];

int l[100000], d[100000], b[100000], cnt[200001], u[200000], v[200000], r[200000], que[100000];

int main() {

	int n, m, q; reader(n); reader(m); reader(q);

	rep(i, m) {

		reader(u[i]); reader(v[i]); u[i]--; v[i]--; r[i] = q;

		l[u[i]]++; l[v[i]]++;

	}

	rep(i, n)E[i].reserve(l[i]), l[i] = 0;

	rep(i, q) {

		int a; reader(a); r[a - 1] = i;

	}

	rep(i, m) {

		E[u[i]][l[u[i]]++] = P(v[i], r[i]);

		E[v[i]][l[v[i]]++] = P(u[i], r[i]);

	}

	d[0] = 1; b[0] = q;

	int s = 0, g = 1;

	while (s != g) {

		int p = que[s++];

		rep(i, l[p]) {

			P v = E[p][i];

			if (d[v.first] == 0) {

				d[v.first] = d[p] + 1; que[g++] = v.first;

			}

			if (d[v.first] == d[p] + 1)

				b[v.first] = max(b[v.first], min(b[p], v.second));

		}

	}

	rep(i, n)cnt[b[i]]++;

	int ans = 0;

	rep(i, q) {

		ans += cnt[i];

		writer(ans, '\n');

	}

}
// Slower C++ solution:
#include<bits/stdc++.h>

#define rep(i,n)for(int i=0;i<n;i++)

using namespace std;



void reader(int *x) {

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

	while (1) {

		k = getchar_unlocked();

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

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

	}

}

vector<int>E[100000];

int u[200000], v[200000], r[200000], ans[200000], d[100000], cnt = 1;

bool b[200000], ok[100000];

queue<int>que;



void bfs(int u, int t) {

	que.push(u);

	while (!que.empty()) {

		int p = que.front(); que.pop(); for (int v : E[p]) {

			if (t) {

				if (d[v] > d[p] && !ok[v]) {

					ok[v] = 1; cnt++; que.push(v);

				}

			}

			else if (!~d[v]) {

				d[v] = d[p] + 1; que.push(v);

			}

		}

	}

}

int main() {

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

	rep(i, m) {

		reader(&u[i]); reader(&v[i]);

		u[i]--; v[i]--;

		E[u[i]].emplace_back(v[i]); E[v[i]].emplace_back(u[i]);

	}

	memset(d, -1, sizeof(d));

	d[0] = 0; bfs(0, 0);

	rep(i, m) {

		if (d[u[i]] > d[v[i]])swap(u[i], v[i]);

	}

	rep(i, n)E[i].clear();

	rep(i, q) {

		reader(&r[i]); r[i]--;

		b[r[i]] = true;

	}

	ok[0] = true;

	rep(i, m) {

		if (!b[i]) {

			if (d[v[i]] - d[u[i]] == 1) {

				E[u[i]].emplace_back(v[i]);

			}

		}

	}

	bfs(0, 1);

	for (int i = q - 1; i >= 0; i--) {

		ans[i] = n - cnt;

		if (d[v[r[i]]] - d[u[r[i]]] == 1 && !ok[v[r[i]]]) {

			E[u[r[i]]].emplace_back(v[r[i]]);

			if (ok[u[r[i]]]) {

				cnt++; ok[v[r[i]]] = true;

				bfs(v[r[i]], 1);

			}

		}

	}

	rep(i, q)printf("%d\n", ans[i]);

}

// Faster C++ solution for the same problem (measured speedup: 1.1181704580568939x):
#include<bits/stdc++.h>

#define rep(i,n)for(int i=0;i<(n);i++)

#define mygc(c) (c)=getchar_unlocked()

#define mypc(c) putchar_unlocked(c)

void reader(int& x) { int k, m = 0; x = 0; for (;;) { mygc(k); if (k == '-') { m = 1; break; }if ('0' <= k&&k <= '9') { x = k - '0'; break; } }for (;;) { mygc(k); if (k<'0' || k>'9')break; x = x * 10 + k - '0'; }if (m) x = -x; }

void writer(int x, char c) { int s = 0, m = 0; char f[10]; if (x<0)m = 1, x = -x; while (x)f[s++] = x % 10, x /= 10; if (!s)f[s++] = 0; if (m)mypc('-'); while (s--)mypc(f[s] + '0'); mypc(c); }

using namespace std;

typedef pair<int, int>P;



vector<P>E[100000];

int l[100000], d[100000], b[100000], cnt[200001], u[200000], v[200000], r[200000], que[100000];

int main() {

	int n, m, q; reader(n); reader(m); reader(q);

	rep(i, m) {

		reader(u[i]); reader(v[i]); u[i]--; v[i]--; r[i] = q;

		l[u[i]]++; l[v[i]]++;

	}

	rep(i, n)E[i].reserve(l[i]), l[i] = 0;

	rep(i, q) {

		int a; reader(a); r[a - 1] = i;

	}

	rep(i, m) {

		E[u[i]][l[u[i]]++] = P(v[i], r[i]);

		E[v[i]][l[v[i]]++] = P(u[i], r[i]);

	}

	d[0] = 1; b[0] = q;

	int s = 0, g = 1;

	while (s != g) {

		int p = que[s++];

		rep(i, l[p]) {

			P v = E[p][i];

			if (d[v.first] == 0) {

				d[v.first] = d[p] + 1; que[g++] = v.first;

			}

			if (d[v.first] == d[p] + 1)

				b[v.first] = max(b[v.first], min(b[p], v.second));

		}

	}

	rep(i, n)cnt[b[i]]++;

	int ans = 0;

	rep(i, q) {

		ans += cnt[i];

		writer(ans, '\n');

	}

}
// Slower C++ solution:
#include<bits/stdc++.h>

#define rep(i,n)for(int i=0;i<n;i++)

using namespace std;



void reader(int *x) {

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

	while (1) {

		k = getchar_unlocked();

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

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

	}

}

vector<int>E[100000];

int u[200000], v[200000], r[200000], ans[200000], d[100000], cnt = 1;

bool b[200000], ok[100000]{ 1 };

queue<int>que;



void bfs(int u, int t) {

	que.push(u);

	while (!que.empty()) {

		int p = que.front(); que.pop(); for (int v : E[p]) {

			if (t) {

				if (d[v] > d[p] && !ok[v]) {

					ok[v] = 1; cnt++; que.push(v);

				}

			}

			else if (!~d[v]) {

				d[v] = d[p] + 1; que.push(v);

			}

		}

	}

}

int main() {

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

	rep(i, m) {

		reader(&u[i]); reader(&v[i]);

		u[i]--; v[i]--;

		E[u[i]].emplace_back(v[i]); E[v[i]].emplace_back(u[i]);

	}

	memset(d, -1, sizeof(d));

	d[0] = 0; bfs(0, 0);

	rep(i, m) {

		if (d[u[i]] > d[v[i]])swap(u[i], v[i]);

	}

	rep(i, n)E[i].clear();

	rep(i, q) {

		reader(&r[i]); r[i]--;

		b[r[i]] = 1;

	}

	rep(i, m) {

		if (!b[i]) {

			if (d[v[i]] > d[u[i]]) {

				E[u[i]].emplace_back(v[i]);

			}

		}

	}

	bfs(0, 1);

	for (int i = q - 1; i >= 0; i--) {

		ans[i] = n - cnt;

		if (d[v[r[i]]] > d[u[r[i]]] && !ok[v[r[i]]]) {

			E[u[r[i]]].emplace_back(v[r[i]]);

			if (ok[u[r[i]]]) {

				cnt++; ok[v[r[i]]] = 1;

				bfs(v[r[i]], 1);

			}

		}

	}

	rep(i, q)printf("%d\n", ans[i]);

}

// Faster C++ solution for the same problem (measured speedup: 1.118185475351812x):
#include<bits/stdc++.h>

#define rep(i,n)for(int i=0;i<(n);i++)

#define mygc(c) (c)=getchar_unlocked()

#define mypc(c) putchar_unlocked(c)

void reader(int& x) { int k, m = 0; x = 0; for (;;) { mygc(k); if (k == '-') { m = 1; break; }if ('0' <= k&&k <= '9') { x = k - '0'; break; } }for (;;) { mygc(k); if (k<'0' || k>'9')break; x = x * 10 + k - '0'; }if (m) x = -x; }

void writer(int x, char c) { int s = 0, m = 0; char f[10]; if (x<0)m = 1, x = -x; while (x)f[s++] = x % 10, x /= 10; if (!s)f[s++] = 0; if (m)mypc('-'); while (s--)mypc(f[s] + '0'); mypc(c); }

using namespace std;

typedef pair<int, int>P;



vector<P>E[100000];

int l[100000], d[100000], b[100000], cnt[200001], u[200000], v[200000], r[200000], que[100000];

int main() {

	int n, m, q; reader(n); reader(m); reader(q);

	rep(i, m) {

		reader(u[i]); reader(v[i]); u[i]--; v[i]--; r[i] = q;

		l[u[i]]++; l[v[i]]++;

	}

	rep(i, n)E[i].reserve(l[i]), l[i] = 0;

	rep(i, q) {

		int a; reader(a); r[a - 1] = i;

	}

	rep(i, m) {

		E[u[i]][l[u[i]]++] = P(v[i], r[i]);

		E[v[i]][l[v[i]]++] = P(u[i], r[i]);

	}

	d[0] = 1; b[0] = q;

	int s = 0, g = 1;

	while (s != g) {

		int p = que[s++];

		rep(i, l[p]) {

			P v = E[p][i];

			if (d[v.first] == 0) {

				d[v.first] = d[p] + 1; que[g++] = v.first;

			}

			if (d[v.first] == d[p] + 1)

				b[v.first] = max(b[v.first], min(b[p], v.second));

		}

	}

	rep(i, n)cnt[b[i]]++;

	int ans = 0;

	rep(i, q) {

		ans += cnt[i];

		writer(ans, '\n');

	}

}
// Slower C++ solution:
#include<bits/stdc++.h>

#define rep(i,n)for(int i=0;i<n;i++)

using namespace std;



void reader(int *x) {

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

	while (1) {

		k = getchar_unlocked();

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

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

	}

}

vector<int>E[100000];

int u[200000], v[200000], r[200000], ans[200000], d[100000], cnt = 1;

char b[200000], ok[100000]{ 1 };

queue<int>que;



void bfs(int u, int t) {

	que.push(u);

	while (!que.empty()) {

		int p = que.front(); que.pop(); for (int v : E[p]) {

			if (t) {

				if (d[v] > d[p] && !ok[v]) {

					ok[v] = 1; cnt++; que.push(v);

				}

			}

			else if (!~d[v]) {

				d[v] = d[p] + 1; que.push(v);

			}

		}

	}

}

int main() {

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

	rep(i, m) {

		reader(&u[i]); reader(&v[i]);

		u[i]--; v[i]--;

		E[u[i]].emplace_back(v[i]); E[v[i]].emplace_back(u[i]);

	}

	memset(d, -1, sizeof(d));

	d[0] = 0; bfs(0, 0);

	rep(i, m) {

		if (d[u[i]] > d[v[i]])swap(u[i], v[i]);

	}

	rep(i, n)E[i].clear();

	rep(i, q) {

		reader(&r[i]); r[i]--;

		b[r[i]] = 1;

	}

	rep(i, m) {

		if (!b[i]) {

			if (d[v[i]] > d[u[i]]) {

				E[u[i]].emplace_back(v[i]);

			}

		}

	}

	bfs(0, 1);

	for (int i = q - 1; i >= 0; i--) {

		ans[i] = n - cnt;

		if (d[v[r[i]]] > d[u[r[i]]] && !ok[v[r[i]]]) {

			E[u[r[i]]].emplace_back(v[r[i]]);

			if (ok[u[r[i]]]) {

				cnt++; ok[v[r[i]]] = 1;

				bfs(v[r[i]], 1);

			}

		}

	}

	rep(i, q)printf("%d\n", ans[i]);

}

// Faster C++ solution for the same problem (measured speedup: 1.118185475351812x):
#include<bits/stdc++.h>

#define rep(i,n)for(int i=0;i<(n);i++)

#define mygc(c) (c)=getchar_unlocked()

#define mypc(c) putchar_unlocked(c)

void reader(int& x) { int k, m = 0; x = 0; for (;;) { mygc(k); if (k == '-') { m = 1; break; }if ('0' <= k&&k <= '9') { x = k - '0'; break; } }for (;;) { mygc(k); if (k<'0' || k>'9')break; x = x * 10 + k - '0'; }if (m) x = -x; }

void writer(int x, char c) { int s = 0, m = 0; char f[10]; if (x<0)m = 1, x = -x; while (x)f[s++] = x % 10, x /= 10; if (!s)f[s++] = 0; if (m)mypc('-'); while (s--)mypc(f[s] + '0'); mypc(c); }

using namespace std;

typedef pair<int, int>P;



vector<P>E[100000];

int l[100000], d[100000], b[100000], cnt[200001], u[200000], v[200000], r[200000], que[100000];

int main() {

	int n, m, q; reader(n); reader(m); reader(q);

	rep(i, m) {

		reader(u[i]); reader(v[i]); u[i]--; v[i]--; r[i] = q;

		l[u[i]]++; l[v[i]]++;

	}

	rep(i, n)E[i].reserve(l[i]), l[i] = 0;

	rep(i, q) {

		int a; reader(a); r[a - 1] = i;

	}

	rep(i, m) {

		E[u[i]][l[u[i]]++] = P(v[i], r[i]);

		E[v[i]][l[v[i]]++] = P(u[i], r[i]);

	}

	d[0] = 1; b[0] = q;

	int s = 0, g = 1;

	while (s != g) {

		int p = que[s++];

		rep(i, l[p]) {

			P v = E[p][i];

			if (d[v.first] == 0) {

				d[v.first] = d[p] + 1; que[g++] = v.first;

			}

			if (d[v.first] == d[p] + 1)

				b[v.first] = max(b[v.first], min(b[p], v.second));

		}

	}

	rep(i, n)cnt[b[i]]++;

	int ans = 0;

	rep(i, q) {

		ans += cnt[i];

		writer(ans, '\n');

	}

}
// Slower C++ solution:
#include<bits/stdc++.h>

#define rep(i,n)for(int i=0;i<n;i++)

using namespace std;



void reader(int *x) {

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

	while (1) {

		k = getchar_unlocked();

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

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

	}

}

vector<int>E[100000];

int u[200000], v[200000], r[200000], ans[200000], d[100000], cnt = 1;

char b[200000], ok[100000]{ 1 };

deque<int>que;



void bfs(int u, int t) {

	que.emplace_back(u);

	while (!que.empty()) {

		int p = que.front(); que.pop_front();

		for (int v : E[p]) {

			if (t) {

				if (d[v] > d[p] && !ok[v]) {

					ok[v] = 1; cnt++; que.emplace_back(v);

				}

			}

			else if (!~d[v]) {

				d[v] = d[p] + 1; que.emplace_back(v);

			}

		}

	}

}

int main() {

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

	rep(i, m) {

		reader(&u[i]); reader(&v[i]);

		u[i]--; v[i]--;

		E[u[i]].emplace_back(v[i]); E[v[i]].emplace_back(u[i]);

	}

	memset(d, -1, sizeof(d));

	d[0] = 0; bfs(0, 0);

	rep(i, m) {

		if (d[u[i]] > d[v[i]])swap(u[i], v[i]);

	}

	rep(i, n)E[i].clear();

	rep(i, q) {

		reader(&r[i]); r[i]--;

		b[r[i]] = 1;

	}

	rep(i, m) {

		if (!b[i]) {

			if (d[v[i]] > d[u[i]]) {

				E[u[i]].emplace_back(v[i]);

			}

		}

	}

	bfs(0, 1);

	for (int i = q - 1; i >= 0; i--) {

		ans[i] = n - cnt;

		if (d[v[r[i]]] > d[u[r[i]]] && !ok[v[r[i]]]) {

			E[u[r[i]]].emplace_back(v[r[i]]);

			if (ok[u[r[i]]]) {

				cnt++; ok[v[r[i]]] = 1;

				bfs(v[r[i]], 1);

			}

		}

	}

	rep(i, q)printf("%d\n", ans[i]);

}

// Faster C++ solution for the same problem (measured speedup: 1.1181610027230566x):
#include<bits/stdc++.h>

#define rep(i,n)for(int i=0;i<(n);i++)

#define mygc(c) (c)=getchar_unlocked()

#define mypc(c) putchar_unlocked(c)

void reader(int& x) { int k, m = 0; x = 0; for (;;) { mygc(k); if (k == '-') { m = 1; break; }if ('0' <= k&&k <= '9') { x = k - '0'; break; } }for (;;) { mygc(k); if (k<'0' || k>'9')break; x = x * 10 + k - '0'; }if (m) x = -x; }

void writer(int x, char c) { int s = 0, m = 0; char f[10]; if (x<0)m = 1, x = -x; while (x)f[s++] = x % 10, x /= 10; if (!s)f[s++] = 0; if (m)mypc('-'); while (s--)mypc(f[s] + '0'); mypc(c); }

using namespace std;

typedef pair<int, int>P;



vector<P>E[100000];

int l[100000], d[100000], b[100000], cnt[200001], u[200000], v[200000], r[200000], que[100000];

int main() {

	int n, m, q; reader(n); reader(m); reader(q);

	rep(i, m) {

		reader(u[i]); reader(v[i]); u[i]--; v[i]--; r[i] = q;

		l[u[i]]++; l[v[i]]++;

	}

	rep(i, n)E[i].reserve(l[i]), l[i] = 0;

	rep(i, q) {

		int a; reader(a); r[a - 1] = i;

	}

	rep(i, m) {

		E[u[i]][l[u[i]]++] = P(v[i], r[i]);

		E[v[i]][l[v[i]]++] = P(u[i], r[i]);

	}

	d[0] = 1; b[0] = q;

	int s = 0, g = 1;

	while (s != g) {

		int p = que[s++];

		rep(i, l[p]) {

			P v = E[p][i];

			if (d[v.first] == 0) {

				d[v.first] = d[p] + 1; que[g++] = v.first;

			}

			if (d[v.first] == d[p] + 1)

				b[v.first] = max(b[v.first], min(b[p], v.second));

		}

	}

	rep(i, n)cnt[b[i]]++;

	int ans = 0;

	rep(i, q) {

		ans += cnt[i];

		writer(ans, '\n');

	}

}
// Slower C++ solution:
#include<bits/stdc++.h>

#define rep(i,n)for(int i=0;i<n;i++)

using namespace std;



void reader(int *x) {

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

	while (1) {

		k = getchar_unlocked();

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

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

	}

}

vector<int>E[100000];

int u[200000], v[200000], r[200000], ans[200000], d[100000], cnt = 1;

char b[200000], ok[100000]{ 1 };

list<int>que;



void bfs(int u, int t) {

	que.emplace_back(u);

	while (!que.empty()) {

		int p = que.front(); que.pop_front();

		for (int v : E[p]) {

			if (t) {

				if (d[v] > d[p] && !ok[v]) {

					ok[v] = 1; cnt++; que.emplace_back(v);

				}

			}

			else if (!~d[v]) {

				d[v] = d[p] + 1; que.emplace_back(v);

			}

		}

	}

}

int main() {

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

	rep(i, m) {

		reader(&u[i]); reader(&v[i]);

		u[i]--; v[i]--;

		E[u[i]].emplace_back(v[i]); E[v[i]].emplace_back(u[i]);

	}

	memset(d, -1, sizeof(d));

	d[0] = 0; bfs(0, 0);

	rep(i, m) {

		if (d[u[i]] > d[v[i]])swap(u[i], v[i]);

	}

	rep(i, n)E[i].clear();

	rep(i, q) {

		reader(&r[i]); r[i]--;

		b[r[i]] = 1;

	}

	rep(i, m) {

		if (!b[i]) {

			if (d[v[i]] > d[u[i]]) {

				E[u[i]].emplace_back(v[i]);

			}

		}

	}

	bfs(0, 1);

	for (int i = q - 1; i >= 0; i--) {

		ans[i] = n - cnt;

		if (d[v[r[i]]] > d[u[r[i]]] && !ok[v[r[i]]]) {

			E[u[r[i]]].emplace_back(v[r[i]]);

			if (ok[u[r[i]]]) {

				cnt++; ok[v[r[i]]] = 1;

				bfs(v[r[i]], 1);

			}

		}

	}

	rep(i, q)printf("%d\n", ans[i]);

}

// Faster C++ solution for the same problem (measured speedup: 1.1164677034003208x):
#include<bits/stdc++.h>

#define rep(i,n)for(int i=0;i<(n);i++)

#define mygc(c) (c)=getchar_unlocked()

#define mypc(c) putchar_unlocked(c)

void reader(int& x) { int k, m = 0; x = 0; for (;;) { mygc(k); if (k == '-') { m = 1; break; }if ('0' <= k&&k <= '9') { x = k - '0'; break; } }for (;;) { mygc(k); if (k<'0' || k>'9')break; x = x * 10 + k - '0'; }if (m) x = -x; }

void writer(int x, char c) { int s = 0, m = 0; char f[10]; if (x<0)m = 1, x = -x; while (x)f[s++] = x % 10, x /= 10; if (!s)f[s++] = 0; if (m)mypc('-'); while (s--)mypc(f[s] + '0'); mypc(c); }

using namespace std;

typedef pair<int, int>P;



vector<P>E[100000];

int l[100000], d[100000], b[100000], cnt[200001], u[200000], v[200000], r[200000], que[100000];

int main() {

	int n, m, q; reader(n); reader(m); reader(q);

	rep(i, m) {

		reader(u[i]); reader(v[i]); u[i]--; v[i]--; r[i] = q;

		l[u[i]]++; l[v[i]]++;

	}

	rep(i, n)E[i].reserve(l[i]), l[i] = 0;

	rep(i, q) {

		int a; reader(a); r[a - 1] = i;

	}

	rep(i, m) {

		E[u[i]][l[u[i]]++] = P(v[i], r[i]);

		E[v[i]][l[v[i]]++] = P(u[i], r[i]);

	}

	d[0] = 1; b[0] = q;

	int s = 0, g = 1;

	while (s != g) {

		int p = que[s++];

		rep(i, l[p]) {

			P v = E[p][i];

			if (d[v.first] == 0) {

				d[v.first] = d[p] + 1; que[g++] = v.first;

			}

			if (d[v.first] == d[p] + 1)

				b[v.first] = max(b[v.first], min(b[p], v.second));

		}

	}

	rep(i, n)cnt[b[i]]++;

	int ans = 0;

	rep(i, q) {

		ans += cnt[i];

		writer(ans, '\n');

	}

}
// 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++;

						}

					}

				}

			}

		}

		cout << cnt << endl;

	}

	return 0;

}

// Faster C++ solution for the same problem (measured speedup: 1.457109629377094x):
#include<bits/stdc++.h>

using namespace std;

int n,m,q,a[1<<18],b[1<<18],c,dist[1<<18],T[1<<18],cnt,U[1<<18];

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

int main(){

	scanf("%d%d%d",&n,&m,&q);

	for(int i=0;i<m;i++){scanf("%d%d",&a[i],&b[i]);x[a[i]].push_back(make_pair(b[i],i));x[b[i]].push_back(make_pair(a[i],i));}

	fill(dist,dist+n+1,-1);dist[1]=0;queue<int>Q;Q.push(1);

	while(!Q.empty()){int a1=Q.front();Q.pop();for(pair<int,int>i:x[a1]){if(dist[i.first]==-1){dist[i.first]=dist[a1]+1;Q.push(i.first);}}}

	for(int i=1;i<=n;i++){for(pair<int,int>j:x[i]){if(dist[i]<dist[j.first]){y[i].push_back(j);T[j.first]++;}}}

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

		scanf("%d",&c);c--;queue<pair<int,int> >Q1; int ss=-1;

		if(dist[a[c]]<dist[b[c]])ss=b[c];

		if(dist[a[c]]>dist[b[c]])ss=a[c];

		if(ss>=1&&U[ss]==0&&used[c]==false){

			Q1.push(make_pair(ss,c));

			while(!Q1.empty()){

				int a1=Q1.front().first,a2=Q1.front().second;Q1.pop();

				if(U[a1]==1||used[a2]==true)continue;T[a1]--;used[a2]=true;if(T[a1]!=0)continue;cnt++;U[a1]=1;

				for(pair<int,int>j:y[a1]){if(U[j.first]==0)Q1.push(j);}

			}

		}

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

	}

}