#include <bits/stdc++.h>
using namespace std;
///////////////////////////////////////////////
#define int long long
#define endl "\n"
#define IO ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define INF 0x3F3F3F3F3F3F3F3F
#define ss second
#define ff first
#define pb push_back
#define ins insert
#define all(a) a.begin() , a.end()
#define input(a , n) for(int i = 0 ; i < n ; i ++) cin >> a[i]
//#define cin fin
//#define cout fout
///////////////////////////////////////////////
//ofstream fout ("ride.out");
//ifstream fin ("ride.in");
///////////////////////////////////////////////
const int sz = 1e5 + 5 ;
const int LG = 20 ;
const int N = 700 ;
const int mod = 1e9 + 7 ;
const int MAXM = 1e9 + 7 ;
///////////////////////////////////////////////
vector<pair<int , int>>adj[sz] ;
vector<int>dist1(sz , INF) ;
vector<int>dist2(sz , INF) ;
vector<int>dist3(sz , INF) ;
void dijikstra1(int node) {
dist1[node] = 0 ;
priority_queue<pair<int , int> , vector<pair<int , int>> , greater<pair<int , int>>>pq ;
pq.push({0, node});
while(!pq.empty()) {
int dis = pq.top().ff ;
int u = pq.top().ss ;
pq.pop();
if(dis <= dist1[u]) {
for(auto edge : adj[u]) {
int v = edge.ff ;
int weight = edge.ss ;
if (dist1[u] + weight < dist1[v]) {
dist1[v] = dist1[u] + weight ;
pq.push({dist1[v] , v});
}
}
}
}
}
void dijikstra2(int node) {
dist2[node] = 0 ;
priority_queue<pair<int , int> , vector<pair<int , int>> , greater<pair<int , int>>>pq ;
pq.push({0 , node});
while(!pq.empty()) {
int dis = pq.top().ff;
int u = pq.top().ss;
pq.pop() ;
if(dis <= dist2[u]) {
for(auto edge : adj[u]) {
int v = edge.ff;
int weight = edge.ss;
if (dist2[u] + weight < dist2[v]) {
dist2[v] = dist2[u] + weight;
pq.push({dist2[v], v});
}
}
}
}
}
void dijikstra3(int node) {
dist3[node] = 0 ;
priority_queue<pair<int , int> , vector<pair<int , int>> , greater<pair<int , int>>>pq ;
pq.push({0, node});
while(!pq.empty()) {
int dis = pq.top().ff ;
int u = pq.top().ss ;
pq.pop();
if(dis <= dist3[u]) {
for(auto edge : adj[u]) {
int v = edge.ff ;
int weight = edge.ss ;
if (dist3[u] + weight < dist3[v]) {
dist3[v] = dist3[u] + weight ;
pq.push({dist3[v] , v});
}
}
}
}
}
///////////////////////////////////////////////
void solve() {
int n ;
cin >> n ;
int m ;
cin >> m ;
int s ;
cin >> s ;
int t ;
cin >> t ;
int u ;
cin >> u ;
int v ;
cin >> v ;
for(int i = 0 ; i < m ; i ++) {
int x , y ;
cin >> x >> y ;
int w ;
cin >> w ;
adj[x].push_back({y , w}) ;
adj[y].push_back({x , w}) ;
}
dijikstra1(s) ;
dijikstra2(v) ;
dijikstra3(t) ;
int ans = INF ;
for(int i = 1 ; i <= n ; i ++) {
if(dist1[i] + dist3[i] == dist3[s]) ans = min(ans , dist2[i]) ;
}
cout << ans ;
}
///////////////////////////////////////////////
///////////////////////////////////////////////
signed main() {
//freopen("mootube.in", "r", stdin);
//freopen("mootube.out", "w", stdout);
//sufcompute() ;
IO ;
int t = 1 ; // cin >> t ;
while(t --) {
solve() ;
cout << endl ;
}
}