Copy #include <iostream>
#include <queue>
#include <vector>
#include <stdio.h>
#include <algorithm>
using namespace std;
typedef long long ll;
class CompareCost{
public:
bool operator()(pair<int, ll> n1, pair<int, ll> n2){
return n1.second > n2.second;
}
};
const int INF = 800001;
vector <pair <int, ll> > edges[801];
priority_queue <int, vector<int>, greater<ll> > mustPass;
bool isVisited[801];
ll dist[801];
int N;
void dijkstra(int start, int dst){
fill_n(dist, N+1, INF);
fill_n(isVisited, N+1, false);
dist[start] = 0;
priority_queue <pair <int, int>, vector <pair <int, int> >, CompareCost> pq;
pq.push(make_pair(start, dist[start]));
while(!pq.empty()){
int current;
do {
current = pq.top().first;
pq.pop();
}while(!pq.empty() && isVisited[current]);
if(current == dst) return;
isVisited[current] = true;
for(int i = 0; i<edges[current].size(); i++){
int to = edges[current][i].first;
ll cost = edges[current][i].second;
if(dist[to] > dist[current] + cost){
dist[to] = dist[current] + cost;
pq.push(make_pair(to, dist[to]));
}
}
}
}
int main() {
int M, mustPassArr[2];
ll result1 = 0, result2 = 0;
scanf("%d %d", &N, &M);
for(int i = 0; i<M; i++){
int from, to, cost;
scanf("%d %d %d", &from, &to, &cost);
edges[from].push_back(make_pair(to, cost));
edges[to].push_back(make_pair(from, cost));
}
scanf("%d %d", &mustPassArr[0], &mustPassArr[1]);
for (int i=0; i<2; i++) mustPass.push(mustPassArr[i]);
dijkstra(1, mustPassArr[0]);
result1 += dist[mustPassArr[0]];
dijkstra(mustPassArr[0], mustPassArr[1]);
result1 += dist[mustPassArr[1]];
dijkstra(mustPassArr[1], N);
result1 += dist[N];
dijkstra(1, mustPassArr[1]);
result2 += dist[mustPassArr[1]];
dijkstra(mustPassArr[1], mustPassArr[0]);
result2 += dist[mustPassArr[0]];
dijkstra(mustPassArr[0], N);
result2 += dist[N];
ll result = min(result1, result2);
if(result >= INF)printf("-1\n");
else{
printf("%lld\n", result);
}
return 0;
}