#include<bits/stdc++.h>
using namespace std;
#define inf32 INT32_MAX / 2
const int N = 500010;
struct edge{
int to;
int dis;
edge(int a,int b){
to = a;
dis = b;
}
};
vector<edge> g[N];
int n,p,c;
queue<int> que;
int dis[N];
int v[N];//是否在队列里;
int a[N];
void spfa(int s){
memset(v,0,sizeof(v));
memset(dis,0x3f,sizeof(dis));
dis[s] = 0;
que.push(s);
v[s] = 1;
while(!que.empty()){
int x = que.front();
que.pop();
v[x] = 0;
for(int i = 0 ; i < g[x].size() ; i++){
int y = g[x][i].to;
int w = g[x][i].dis;
if(dis[y] > dis[x] + w){
dis[y] = dis[x] + w;
if(!v[y]){
que.push(y);
v[y] = 1;
}
}
}
}
}
int main(){
ios::sync_with_stdio(0),cin.tie(0);
cin >> n >> p >> c;
for(int i = 1 ; i <= n ; i++){
cin >> a[i];
}
for(int i = 1 ; i <= c ; i++){
int a,b,d;
cin >> a >> b >> d;
g[a].push_back(edge(b,d));
g[b].push_back(edge(a,d));
}
int minn =
for(int i = 1 ; i <= p ; i++){
spfa(i);//计算以每一个点作为起点的最短路径,对总和取最小;
int ans = 0;
for(int j = 1 ; j <= n ; j++){
ans += dis[a[j]];
}
minn = min(minn,ans);
}
cout << minn << endl;
return 0;
}