#include<bits/stdc++.h>
using namespace std;
#define N 100001
#define int long long
struct node{
int nxt,to,dis;
}e[2*N];
int head[N];
int cnt;
void add_edge(int u,int v,int w){
e[++cnt].nxt=head[u];
e[cnt].to=v,e[cnt].dis=w;
head[u]=cnt;
}
int n,m;
int re[7];
int dist[7][N],vis[N];
void dijkstra(int id,int s){
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q;
memset(vis,0,sizeof vis);
dist[id][s]=0;
q.push(make_pair(0,s));
while(q.size()){
int p=q.top().second;
q.pop();
if(vis[p]) continue;
vis[p]=1;
for(int i=head[p];i;i=e[i].nxt){
if(dist[id][e[i].to]>dist[id][p]+e[i].dis){
dist[id][e[i].to]=dist[id][p]+e[i].dis;
q.push(make_pair(e[i].dis,e[i].to));
}
}
}
}
int viss[N];
int ans=0x3f3f3f3f;
void dfs(int last,int cost,int dep){
if(cost>ans) return;
if(dep==5){
ans=min(ans,cost);
return;
}
for(int i=1;i<=5;i++){
if(!viss[i]){
viss[i]=1;
dfs(i,cost+dist[last][re[i]],dep+1);
viss[i]=0;
}
}
}
signed main(){
cin>>n>>m;
for(int i=1;i<=5;i++) cin>>re[i];
re[6]=1;
memset(dist,0x3f3f3f3f,sizeof dist);
for(int i=1;i<=m;i++){
int u,v,w;
cin>>u>>v>>w;
add_edge(u,v,w);
add_edge(v,u,w);
}
for(int i=1;i<=6;i++) dijkstra(i,re[i]);
memset(viss,0,sizeof 0);
dfs(6,0,0);
cout<<ans<<endl;
return 0;
}
谢谢了!