#pragma GCC optimize("O3,inline")
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define INF 100000000000LL
vector<vector<int>> adjlist;
vector<int> start;
signed main() {
//ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int N, M, K, a, b; cin >> N >> M >> K;
adjlist.resize(N, vector<int>());
for (int i = 0; i < M; i++) {
cin >> a >> b; a--, b--;
adjlist[a].push_back(b);
adjlist[b].push_back(a);
}
string S; cin >> S;
for (int i = 0; i < K; i++) {
cin >> a; a--;
start.push_back(a);
}
int esum = 0;
for (char i : S) esum += (i - '0');
if (esum == 0) {
vector<int> dist(N, INF);
queue<int> bfs;
dist[start[0]] = 0;
bfs.push(start[0]);
while (bfs.size()) {
int i = bfs.front(); bfs.pop();
for (int j : adjlist[i]) {
if (dist[j] != INF) continue;
dist[j] = dist[i] + 1;
bfs.push(j);
}
}
for (int i : dist) cout << i << '\n';
return 0;
}
vector<vector<int>> dist(N, vector<int>(N, INF));
queue<pair<int, int>> bfs;
dist[0][start[0]] = 0;
bfs.push({start[0], 0});
while (bfs.size()) {
auto i = bfs.front(); bfs.pop();
if (i.second == N - 1) continue;
int od = dist[i.second][i.first];
if ((i.first != start[0] || i.second) && S[i.first] == '1') i.second++;
for (int j : adjlist[i.first]) {
if (dist[i.second][j] != INF) continue;
dist[i.second][j] = od + 1;
bfs.push({j, i.second});
}
}
bitset<50000> spec = 0;
for (int i = 0; i < N; i++) {
if (S[i] == '0') continue;
for (int j : adjlist[i]) if (S[j] == '1') spec[i] = 1;
}
vector<int> A(K, INF), B(K, INF);
A[0] = 0;
for (int i = 1; i < K; i++) {
vector<int> dist1(N, INF);
deque<int> bfs1;
dist1[start[i]] = 0;
bfs1.push_front(start[i]);
while (bfs1.size()) {
int j = bfs1.front(); bfs1.pop_front();
if (j != start[i] && S[j] == '1' && A[i] == INF) A[i] = dist1[j] + 1;
if (j != start[i] && spec[j]) {
B[i] = dist1[j];
break;
}
for (int k : adjlist[j]) {
if (dist1[k] != INF) continue;
if (S[k] == '0') {
dist1[k] = dist1[j] + 1;
bfs1.push_back(k);
}
else {
dist1[k] = dist1[j];
bfs1.push_front(k);
}
}
}
if (S[start[i]] == '1') A[i] = min(A[i], 2LL);
}
//for (int i : A) cout << i << ' ';
//cout << '\n';
//for (int i : B) cout << i << ' ';
//cout << '\n';
//for (int i = 0; i < N; i++) {
//for (int j : dist[i]) cout << j << ' ';
//cout << '\n';
//}
vector<int> funny, anss(N, INF);
for (int i = 1; i < K; i++) funny.push_back(B[i] - A[i] + 2);
sort(funny.begin(), funny.end());
int crntcost = 0;
for (int i = 0; i < N; i++) {
//cout << crntcost << ' ' << i << '\n';
for (int j = 0; j < N; j++) anss[j] = min(anss[j], crntcost + dist[i][j]);
if (i == 0) {
for (int j : A) crntcost += j;
continue;
}
crntcost += 2 * K - 2 - (int)(upper_bound(funny.begin(), funny.end(), i) - funny.begin());
}
for (int i : anss) cout << i << '\n';
}