#include <cstring>
using namespace std;
const int INF = 0x3f3f3f3f;
const int mmax = 1010;
int t, s, d;
int map[mmax][mmax], dis[mmax], vis[mmax];
int near[mmax], ace[mmax];
int must;
int min (int a, int b)
{
if (a > b)
return b;
else
return a;
}
void Dijkstra ()
{
int j, k;
for (int i = 1; i <= must; i++)
{
dis[i] = map[0][i];
vis[i] = 0;
}
dis[0] = 0;
vis[0] = 1;
for (int i = 1; i <= must; i++)
{
int temp = INF;
for (j = 1; j <= must; j++)
{
if (!vis[j] && dis[j] < temp)
{
k = j;
temp = dis[j];
}
}
vis[k] = 1;
for (j = 1; j <= must; j++)
{
if (!vis[j] && dis[j] > dis[k] + map[k][j])
{
dis[j] = dis[k] + map[k][j];
}
}
}
}
int main ()
{
while (scanf ("%d%d%d", &t, &s, &d)!= EOF)
{
int m = INF;
int i;
must = 0;
memset (map, INF, sizeof(map));
for (i = 1; i <= t; i++)
{
int a, b, time;
scanf ("%d%d%d", &a, &b, &time);
if (b > must)
must = b;
if (a > must)
must = a;
if (time < map[a][b])
{
map[a][b] = time;
map[b][a] = time;
}
}
for (i = 0; i < s; i++)
{
scanf ("%d", near + i);
map[0][near[i]] = 0;
map[near[i]][0] = 0;
}
for (i = 0; i < d; i++)
scanf ("%d", ace + i);
Dijkstra();
for (i = 0; i < d; i++)
{
m = min(m, dis[ace[i]]);
}
printf ("%d\n", m);
}
return 0;
}