#include<iostream>
#include<vector>
#include<queue>
using namespace std;
const int MAXN=1005;
const int MAX=999999999;
struct edge
{
int from,to,cost;
};
vector<edge>v[MAXN];
int dist[MAXN];
bool in_queue[MAXN];
void init()
{
int i=0;
for(i=0;i<=MAXN-1;i++)
{
v[i].clear();
}
memset(in_queue,0,sizeof(in_queue));
}
void spfa(int p)
{
queue<int>q;
int i=0;
for(i=0;i<=MAXN-1;i++)
{
dist[i]=MAX;
}
while(!q.empty())
{
q.pop();
}
dist[p]=0;
q.push(p);
in_queue[p]=1;
while(!q.empty())
{
int cur=q.front();
int i=0;
q.pop();
in_queue[cur]=0;
for(i=0;i<=int(v[cur].size())-1;i++)
{
int cost=v[cur][i].cost+dist[cur];
int to=v[cur][i].to;
if(cost<dist[to])
{
dist[to]=cost;
if(!in_queue[to])
{
q.push(to);
in_queue[to]=1;
}
}
}
}
}
int main()
{
int T,S,D;
while(cin>>T>>S>>D)
{
init();
while(T--)
{
int from,to,cost;
cin>>from>>to>>cost;
edge e={from,to,cost};
v[e.from].push_back(e);
swap(e.from,e.to);
v[e.from].push_back(e);
}
int i,j;
int f[MAXN];
int t[MAXN];
int min=-1;
for(i=0;i<=S-1;i++)
{
cin>>f[i];
}
for(i=0;i<=D-1;i++)
{
cin>>t[i];
}
for(i=0;i<=S-1;i++)
{
memset(in_queue,0,sizeof(in_queue));
spfa(f[i]);
for(j=0;j<=D-1;j++)
{
// cout<<dist[t[j]]<<endl;
if(dist[t[j]]<min||min==-1)
{
min=dist[t[j]];
}
}
}
cout<<min<<endl;
}
return 0;
}