#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#define pii pair<int, int>
#define t3 tuple<int, int, int>
#define pepperX ios_base::sync_with_stdio(false); cin.tie(0);
using ll = long long;
using namespace std;
#define int ll
struct A{
int a, w;
bool operator<(const A& o)const{
return w>o.w;
}
};
vector<t3> g[100005];
int dis[100005];
pii par[100005];
void solve(){
int n, m, s, t, ss, tt;
cin >> n >> m;
cin >> s >> t;
cin >> ss >> tt;
for(int i=1; i<=m; i++){
int a, b, w;
cin >> a >> b >> w;
g[a].push_back({b, w, i});
g[b].push_back({a, w, i});
}
fill(dis+1, dis+n+1, 1e18);
priority_queue<A> pq;
pq.push({s, 0});
dis[s]=0;
while(!pq.empty()){
auto [u,w]=pq.top();
pq.pop();
if(w>dis[u])continue;
if(u==t)break;
for(auto [v,ww,id]:g[u]){
if(w+ww<dis[v]){
dis[v]=w+ww;
pq.push({v, w+ww});
par[v]={u, id};
}
}
}
vector<int> path;
int now=t;
while(now!=s){
path.push_back(par[now].second);
now=par[now].first;
}
sort(path.begin(), path.end());
//for(auto e:path)cout << e << ' ';
while(!pq.empty())pq.pop();
fill(dis+1, dis+n+1, 1e18);
pq.push({ss, 0});
dis[ss]=0;
while(!pq.empty()){
auto [u,w]=pq.top();
pq.pop();
if(w>dis[u])continue;
if(u==tt){
cout << w;
return;
}
for(auto [v,ww,id]:g[u]){
if(binary_search(path.begin(), path.end(), id))ww=0;
if(w+ww<dis[v]){
dis[v]=w+ww;
pq.push({v, w+ww});
}
}
}
}
int32_t main(){
pepperX;
int tcs=1;
//cin >> tcs;
while(tcs--) solve();
return 0;
}