#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int inf = 1500*1000*10;
struct Edge{
int from;
int to;
int val;
int next;
} edge[1500];
int head[1010];
int p,c,n,m,cnt = 0;
int np[1010];
int NeedSum[1010];
void AddEdge(int startp,int endp,int lineval){
cnt++;
edge[cnt].from = startp;
edge[cnt].to = endp;
edge[cnt].val = lineval;
edge[cnt].next = head[startp];
head[startp] = cnt;
}
struct Node{
int id;
int use;
bool operator <(const Node &x) const{
return x.use<use;
}
};
Node make(int iid,int uuse){
Node ret;
ret.id = iid;
ret.use = uuse;
return ret;
}
int dis[1010];
bool vis[1010];
priority_queue<Node,vector<Node> > u;
void Dij(int st){
while(!u.empty()) u.pop();
u.push(make(st,0));
while(!u.empty()){
Node fir = u.top();
u.pop();
//printf("id:%d|len:%d\n",fir.id,fir.use);
if(vis[fir.id]) continue;
vis[fir.id] = true;
dis[fir.id] = fir.use;
for(int i = head[fir.id]; i; i = edge[i].next){
if(!vis[edge[i].to]){
dis[edge[i].to] = min(dis[edge[i].to],dis[fir.id]+edge[i].val);
u.push(make(edge[i].to,dis[edge[i].to]));
}
}
}
}
int main(){
cin >> n >> p >> c;
for(int i = 1; i <= n; i++){
cin >> np[i];
}
int cnt = 0;
for(int i = 1; i <= c; i++){
int a,b,d;
cin >> a >> b >> d;
AddEdge(a,b,d);
AddEdge(b,a,d);
}
m = cnt*2;
//cout << "right\n";
//cout << n << " " << p << endl;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= p; j++){
dis[j] = inf;
vis[j] = false;
}
Dij(np[i]);
for(int j = 1; j <= p; j++){
//printf("从%d到%d的最短路:%d\n",np[i],j,dis[j]);
NeedSum[j]+=dis[j];
}
}
int MIN = 1000*1500*250;
for(int i = 1; i <= p; i++){
//cout << i<< " " << NeedSum[i] << endl;
MIN = min(MIN,NeedSum[i]);
}
cout << MIN;
return 0;
}