#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
#define FIN "catun.in"
#define FOUT "catun.out"
#define N 50001
#define INF 100000
int n, m, k, end;
int h[N], p[N], d[N], f[N], r[N];
vector < pair <int, int> > v[N];
void swap(int a, int b, int V[])
{
int aux;
aux = V[a];
V[a] = V[b];
V[b] = aux;
}
void down_heap(int i, int n)
{
int j = i;
if (2 * i <= n && d[h[j]] > d[h[2 * i]])
j = 2 * i;
if (2 * i + 1 <= n && d[h[j]] > d[h[2 * i + 1]])
j = 2 * i + 1;
if (i != j)
{
swap(h[i], h[j], p);
swap(i, j, h);
down_heap(j, n);
}
}
void up_heap(int i, int n)
{
if (i > 1 && d[h[i]] < d[h[i / 2]])
{
swap(h[i], h[i / 2], p);
swap(i, i / 2, h);
up_heap(i / 2, n);
}
}
void solve()
{
int i, j = 0;
for (i = 1; i <= n; ++ i)
{
d[i] = INF;
if (f[i])
{
h[++ end] = i;
p[i] = end;
d[i] = 0;
}
}
while (end)
{
j = h[1];
for (i = 0; i < v[j].size(); ++ i)
if (d[v[j][i].first] >= d[j] + v[j][i].second && p[v[j][i].first] != INF)
{
if (d[j] + v[j][i].second == d[v[j][i].first] && r[v[j][i].first] > j && f[j] && !f[v[j][i].first])
r[v[j][i].first] = j;
else if (f[j] && !f[v[j][i].first])
r[v[j][i].first] = j;
d[v[j][i].first] = d[j] + v[j][i].second;
if (p[v[j][i].first])
{
up_heap(p[v[j][i].first], end);
down_heap(p[v[j][i].first], end);
}
else
{
h[++ end] = v[j][i].first;
p[v[j][i].first] = end;
up_heap(end, end);
}
}
swap(p[j], end, h);
-- end;
down_heap(p[j], end);
p[j] = INF;
}
}
void read()
{
int i, a, b, c;
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
scanf("%d%d%d", &n, &m, &k);
for (i = 1; i <= k; ++ i)
{
scanf("%d", &a);
f[a] = 1;
}
for (i = 1; i <= m; ++ i)
{
scanf("%d%d%d", &a, &b, &c);
v[a].push_back(make_pair(b, c));
v[b].push_back(make_pair(a, c));
scanf("\n");
}
}
int main()
{
int i;
read();
solve();
for (i = 1; i <= n; ++ i)
printf("%d ", r[i]);
printf("\n");
}