#include<bits/stdc++.h>
using namespace std;
const int N=200005;
const int M=50005;
int n,m,cnt,s,u,v,x;
long long ans=2147483647;
int to[N],nxt[N],head[M],val[N],dis[8][M],a[7];
bool vis[M],vi[M];
void add(int u,int v,int x){
cnt++;
nxt[cnt]=head[u];
head[u]=cnt;
val[cnt]=x;
to[cnt]=v;
}
void Dijkstra(int st,int s){
memset(vis,0,sizeof(vis));
priority_queue< pair<int,int>, vector< pair<int,int> >, greater< pair<int,int> > > q; dis[st][val[st]]=0;
q.push(make_pair(0,st));
for(int i=1;i<=n;i++) dis[s][i]=2147483647;
dis[s][st]=0;
while(!q.empty()){
int u=q.top().second;
q.pop();
if(vis[u])continue;
vis[u]=1;
for(int e=head[u];e;e=nxt[e]){
int v=to[e];
if(dis[s][v]>dis[s][u]+val[e]){
dis[st][v]=dis[st][u]+val[e];
q.push(make_pair(dis[st][v],v));
}
}
}
}
long long min(long long a,long long b){
if(a>b) return b;
return a;
}
void dfs(int x,int y,int z){
if(x==5){
ans=min(ans,y);
return;
}
for(int i=1;i<=5;i++){
if(!vi[i]){
vi[i]=1;
dfs(x+1,y+dis[z+1][a[i]],i);
vi[i]=0;
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=5;i++) cin>>a[i];
for(int i=1;i<=m;i++){
cin>>u>>v>>x;
add(u,v,x);
add(v,u,x);
}
Dijkstra(1,1);
for(int i=1;i<=5;i++) Dijkstra(a[i],i+1);
dfs(0,0,0);
cout<<ans<<endl;
return 0;
}