/*
ID:xpycc1
PROG:butter
LANG:C++
*/
#include <fstream>
#define MAXP 800
#define MAXN 500
using namespace std;
ifstream fin("butter.in");
ofstream fout("butter.out");
unsigned int n,p,c,path[MAXP+1][MAXP+1],dist[MAXP+1],scor[MAXN],
cont[MAXP+1][MAXP+1],heap[MAXP+1],len,hash[MAXP+1];
bool isin[MAXP+1];
//以下的两个过程都是偷懒,从HumbleNumbles的那道题目的humble.pas里搬过来的,再用C++重写
void sift1(unsigned int x,unsigned pos){ //上滤
unsigned int i,j; //i parent; j son
j=pos?pos:++len; i=j/2;
/*
*本来是直接写成j=pos;的,
*然后第一次进堆的东东自己在外面写++len这么一条;
*后来注意到第一次没有在堆中的点hash的值是0,
*要进堆的话还是从后面插入
*于是统一一下,就变成这个样子了
*/
while(i>0 && dist[x]<dist[heap[i]]){
heap[j]=heap[i];
hash[heap[j]]=j;
j/=2; i/=2;
}
heap[j]=x; hash[x]=j;
}
void sift(){ //下滤
unsigned int i,j,t;
i=1; j=i*2; t=heap[i];
while(j<=len){
if(j<len && dist[heap[j]]>dist[heap[j+1]]) ++j;
if(dist[t]>=dist[heap[j]]){
heap[i]=heap[j];
hash[heap[i]]=i;
i=j; j=i*2;
}else break;
}
heap[i]=t; hash[t]=i;
}
int main(){
unsigned int i,j,a,b,w,m,mm,u;
fin>>n>>p>>c;
for(i=0;i<n;++i)
fin>>scor[i];
for(i=0;i<c;++i){
fin>>a>>b>>w;
path[a][++cont[a][0]]=path[b][++cont[b][0]]=w;
cont[a][cont[a][0]]=b;
cont[b][cont[b][0]]=a;
}
m=0xFFFFFFFF;
for(i=1;i<=p;++i){
len=0;
//初始化,没办法,就是这么烦
memset(isin,false,sizeof(isin)); isin[i]=true;
memset(heap,0,sizeof(heap));
memset(hash,0,sizeof(hash));
memset(dist,255,sizeof(dist)); dist[i]=0;
for(j=1;j<=cont[i][0];++j){
dist[cont[i][j]]=path[i][j];
sift1(cont[i][j],0); //从后面加入堆
}
while(len){
u=heap[1]; //hash[u]=0; 去掉的两句调试的时候看起来方便点
heap[1]=heap[len--]; //heap[len+1]=0;
hash[heap[1]]=1;
sift();
isin[u]=true;
//由于代码是移植过来的,所以原来的p就不能用了,否则一直错
for(j=1;j<=cont[u][0];++j)
if(!isin[cont[u][j]] && dist[cont[u][j]]>dist[u]+path[u][j]){
dist[cont[u][j]]=dist[u]+path[u][j];
sift1(cont[u][j],hash[cont[u][j]]);
//维护堆(修改或插入)
}
}
mm=0;
for(j=0;j<n;++j)
//MS给出的图都是连通的,不过增加程序健壮性所以加上
if(dist[scor[j]]==0xFFFFFFFF) continue;
else mm+=dist[scor[j]];
if(j==n && mm<m) m=mm;
}
fout<<m<<endl;
return 0;
}