// Created by 小宇 on 2024/1/12.
//
#include <iostream>
#include <cstring>
#include <queue>
#define int long long
using namespace std;
const int INF=0x3f3f3f3f;
const int N=50010,M=400010;
int n,m;
int head[N],to[M],Next[M],W[M],cnt=1;
int list1[N];
int list2[8];
int all[8][8];
int ans=INF;
bool list3[8];
void dijkstra(int u){
bool key[5010]={};
int dis[5010];
::memset(dis,0x3f,sizeof dis);
dis[u]=0;
priority_queue<pair<int ,int>,vector<pair<int ,int>>,greater<pair<int ,int>>> Q;
Q.push({0,u});
while (!Q.empty()){
auto node=Q.top();
Q.pop();
int k=node.second;
key[k]= true;
int temp=head[k];
while (temp){
int i=to[temp];
if(key[i]){
temp=Next[temp];
continue;
}
if(dis[i]>dis[k]+W[temp]){
dis[i]=dis[k]+W[temp];
Q.push({dis[i],i});
}
temp=Next[temp];
}
}
int temp=list1[u];
for (int i = 1; i <=6 ; ++i) {
all[temp][i]=dis[list2[i]];
}
}
void DFS(int u,int s,int sum){
if(sum>=ans){
return;
}
if(s==5){
ans=min(ans,sum);
return;
}
for (int i = 1; i <=6 ; ++i) {
if(i==u || list3[i])continue;
list3[i]= true;
DFS(i,s+1,sum+all[u][i]);
list3[i]= false;
}
}
void build(int u,int v , int w){
W[cnt]=w;
to[cnt]=v;
Next[cnt]=head[u];
head[u]=cnt;
cnt++;
}
signed main(){
::scanf("%d%d",&n,&m);
for (int i = 2; i <= 6; ++i) {
int t;
::scanf("%d",&t);
list1[t]=i;
list2[i]=t;
}
list1[1]=1;
list2[1]=1;
for (int i = 0; i < m; ++i) {
int u,v,w;
::scanf("%d%d%d",&u,&v,&w);
build(u,v,w);
build(v,u,w);
}
::memset(all,0x3f,sizeof all);
for (int i = 1; i <=6 ; ++i) {
dijkstra(list2[i]);
}
list3[1]= true;
DFS(1,0,0);
::printf("%d",ans);
return 0;
}```