#include<bits/stdc++.h>
#define enld '\n'
#define rep(i,n) for(int i=0; i<(n); i++)
using namespace std;
using ll = long long;
using P = pair<int,int>;
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma GCC optimize("Ofast")
constexpr ll INF = 1e18;
constexpr int inf = 1e9;
constexpr ll mod = 1000000007;
constexpr ll mod2 = 998244353;
const double PI = 3.1415926535897932384626433832795028841971;
const int dx[6] = {1, 0, -1, 0,1,1};
const int dy[6] = {0, 1, 0, -1,1,-1};
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
// ---------------------------------------------------------------------------


int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int N,M,K;
    cin >> N >> M >> K;
    vector<int> l(M),r(M),c(M);
    vector<vector<P>> G(N);
    for(int i=0; i<M; i++){
        cin >> l[i] >> r[i] >> c[i];
        l[i]--;r[i]--;
        G[l[i]].emplace_back(r[i],c[i]);
        G[r[i]].emplace_back(l[i],c[i]);
    }
    priority_queue<P,vector<P>,greater<P>> que;
    vector<int> dist(N,inf);
    for(int i=0; i<K; i++){
        int a;
        cin >> a;
        a--;
        dist[a] = 0;
        que.emplace(0,a);
    }
    while(que.size()){
        int v = que.top().second;
        int cost = que.top().first;
        que.pop();
        if(cost > dist[v]) continue;
        for(auto nv: G[v]){
            if(nv.second + cost < dist[nv.first]){
                dist[nv.first] = nv.second + cost;
                que.emplace(dist[nv.first],nv.first); 
            }
        }
    }
    // for(int i=0; i<N; i++){
    //     cout << dist[i] << enld;
    // }
    int ans = 0;
    for(int i=0; i<N; i++){
        chmax(ans,dist[i]);
        for(auto nv: G[i]){
            int v = nv.first;
            int t = (dist[v]+dist[i]+nv.second+1)/2;
            chmax(ans,t);
        }
    }
    cout << ans << enld;
    return 0;
}

