//用一个向量数组代表邻接表,每个元素是一个顶点,向量里存储的是其邻接的顶点
//写一个DFS(int v) 代表去遍历顶点v所在的连通块,其中,若遍历到的结点正好是本轮删除的结点,直接返回
//然后对该顶点的bool置为已查询,再对其每一个邻接顶点,若它的bool是未查询,则递归DFS
//在主函数中先输入n m k等信息,输入邻接关系,然后对于每一个查询k去循环
//循环之外 有一个代表连通块数的变量,并在每次进入循环之前都要把bool数组全置为false
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn = 1111;
vector<int> G[maxn];
int currentPoint;
bool vis[maxn] = {false};
void DFS(int v){
if(v==currentPoint) return;
vis[v] = true;
for(int i=0;i<G[v].size();i++){
if(vis[G[v][i]] == false)
DFS(G[v][i]);
}
}
int main(){
int n, m, k;
scanf("%d%d%d", &n, &m, &k);
for(int i=0;i<m;i++){
int p1, p2;
scanf("%d%d", &p1, &p2);
G[p1].push_back(p2);
G[p2].push_back(p1);
}
for(int i=0;i<k;i++){
int blockNum = 0;
memset(vis, false, sizeof(vis));
scanf("%d", ¤tPoint);
for(int j=1;j<=n;j++){
if(j!=currentPoint && vis[j]==false){
DFS(j);
blockNum++;
}
}
printf("%d\n", blockNum-1);
}
return 0;
}