#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
using namespace std;
int m,k;
typedef pair<int,int> P;
struct edge{
	int to,cost;
};
int V;
vector<edge>G[3005];
int d[3005][3005];
int cou=0;
int mi[3005];
#define INF 1000000000
void dijkstra(int s){
	priority_queue<P, vector<P>, greater<P> >que;
	d[cou][s]=0;
	que.push(make_pair(0,s));
	while(!que.empty()){
		P p=que.top(); que.pop();
		int v=p.second;
		if(d[cou][v]<p.first) continue;
		for(int i=0;i<G[v].size();i++){
			edge e=G[v][i];
			if(d[cou][e.to]>d[cou][v]+e.cost){
				d[cou][e.to]=d[cou][v]+e.cost;
				que.push(P(d[cou][e.to],e.to));
			}
		}
	}
}
int main(){
	scanf("%d %d %d",&V,&m,&k);
	for(int i=0;i<m;i++){
		int a,b,c;
		scanf("%d %d %d",&a,&b,&c);
		a--; b--;
		edge r,t;
		r.to=b; t.to=a;
		r.cost=c; t.cost=c;
		G[a].push_back(r);
		G[b].push_back(t);
	}
	for(int i=0;i<3005;i++){
		for(int j=0;j<3005;j++){
			d[i][j]=INF;
		}
		mi[i]=INF;
	}
	for(int i=0;i<k;i++){
		int sta;
		scanf("%d",&sta);
		dijkstra(sta-1);
		cou++;
	}
	int ans=0,ep=0;
	for(int i=0;i<cou;i++){
		for(int j=0;j<V;j++){
				mi[j]=min(mi[j],d[i][j]);
		}
	}
	int res=0;
	for(int j=0;j<V;j++){
		for(int k=0;k<G[j].size();k++){
			int c=G[j][k].to;
			int w=G[j][k].cost;
			res=max((mi[j]+mi[c]+w+1)/2,res);
		}
	}
	printf("%d\n",res);
}