#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const int N = 50010;
struct Graph{
int v , w;
};vector<Graph> g[N];
struct Node{
int ver;
int distance;
bool operator < (const Node _) const{
return _.distance < distance;
}
};
int n , m;
int stop[7];
int dist[7][N];
int vis[7][N];
int st[7];
int ans = 1e9 + 10;
priority_queue<Node> q;
void dijkstra(int x){
dist[x][x] = 0;
q.push({x , 0});
while(!q.empty()){
auto t = q.top(); q.pop();
int ver = t.ver , distance = t.distance;
if(vis[x][ver]) continue; vis[x][ver] = 1;
for(int i = 0;i < g[ver].size();i++){
int j = g[ver][i].v , w = g[ver][i].w;
if(dist[x][j] > distance + w){
dist[x][j] = distance + w;
q.push({j , dist[x][j]});
}
}
}
}
void dfs(int u , int cost , int last){
if(cost > ans) return ;
if(u == 6){
ans = min(ans , cost);
return ;
}
for(int i = 1;i <= 5;i++){
if(!st[i]){
st[i] = 1;
dfs(u + 1 , cost + dist[last][stop[i]] , stop[i]);
st[i] = 0;
}
}
}
int main(){
cin >> n >> m;
for(int i = 1;i <= 5;i++) cin >> stop[i];
while(m--){
int u , v , w;
scanf("%d%d%d" , &u , &v , &w);
g[u].push_back({v , w});
g[v].push_back({u , w});
}
memset(dist , 0x3f , sizeof dist);
for(int i = 1;i <= 5;i++) dijkstra(stop[i]); dijkstra(1);
dfs(1 , 0 , 1);
cout << ans << endl;
return 0;
}