#include<bits/stdc++.h>
using namespace std;
int to[500005],val[500005],nxt[500005],h[500005],dis[100005][7],vis[100005],n,m,x,t,y,a[6],cnt=0,ans=2147483647;
struct nd{
int v,w;
friend bool operator<(nd a,nd b){
return a.w>b.w;
}
}tmp;
priority_queue<nd>q;
void add(int a,int b,int c) {
to[++cnt]=b,val[cnt]=c,nxt[cnt]=h[a],h[a]=cnt;
}
void Dk(int s) {
int g;
if(s==1)g=1;if(s==a[1])g=2;if(s==a[2])g=3;if(s==a[3])g=4;if(s==a[4])g=5;if(s=a[5])g==6;
memset(vis,0,sizeof(vis));
for(int i=0; i<=n; i++)dis[i][g]=2147483647;
dis[s][g]=0;
q.push((nd){s,0});
while(!q.empty()) {
int u=q.top().v;
q.pop();
if(!vis[u]){
vis[u]=1;
for(int i=h[u]; i; i=nxt[i]){
if(dis[to[i]][g]>val[i]+dis[u][g]){
dis[to[i]][g]=val[i]+dis[u][g];
q.push((nd){to[i],dis[to[i]][g]});
}
}
}
}
}
int main() {
cin>>n>>m>>a[1]>>a[2]>>a[3]>>a[4]>>a[5];
for(int i=1; i<=m; i++) {
cin>>x>>y>>t;
add(x,y,t),add(y,x,t);
}
Dk(1),Dk(a[1]),Dk(a[2]),Dk(a[3]),Dk(a[4]),Dk(a[5]);
for(int i1=1; i1<=5; i1++)
for(int i2=1; i2<=5; i2++)
for(int i3=1; i3<=5; i3++)
for(int i4=1; i4<=5; i4++)
for(int i5=1; i5<=5; i5++)
if(i1!=i2&&i2!=i3&&i3!=i4&&i4!=i5&&i1!=i3&&i1!=i4&&i1!=i5&&i2!=i4&&i2!=i5&&i3!=i5){
ans=min(ans,dis[a[i1]][1]+dis[a[i2]][i1]+dis[a[i3]][i2]+dis[a[i4]][i3]+dis[a[i5]][i4]);
}
cout<<ans;
}