#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define vll vector<ll>
#define vbool vector<bool>
#define pairll pair<ll, ll>
#define pb push_back
#define fi first
#define sc second
void dfs(vector<vll> &path, vector<vll> &w, vll &dist, vbool &vis, vbool &used, ll x, ll tar){
vis[x] = 1;
if(tar == x){
used[x] = 1;
return;
}
for(ll i = 0; i < path[x].size(); i++){
ll nx = path[x][i];
ll wei = w[x][i];
if(!vis[nx]){
dfs(path, w, dist, vis, used, nx, tar);
}
if(!used[nx])continue;
if(dist[nx] == dist[x] + wei){
used[x] = 1;
w[x][i] = 0;
}
}
}
ll find_res(ll n, ll s, ll t, ll u, ll v, vector<vll> path, vector<vll> w){
// do djikstra t -> u
vll dist(n+1, 1e18);
dist[t] = 0;
priority_queue<pairll, vector<pairll>, greater<pairll>> pq, temp;
pq.push({0, t});
while(pq.size()){
ll x, d;
tie(d, x) = pq.top();
pq.pop();
if(dist[x] < d)continue;
for(ll i = 0; i < path[x].size(); i++){
ll nx = path[x][i];
ll wei = w[x][i];
if(dist[nx] <= d + wei)continue;
dist[nx] = d+wei;
pq.push({dist[nx], nx});
}
}
vbool vis(n+1), used(n+1);
dfs(path, w, dist, vis, used, t, s);
// do djikstra with new wei, frm u and v
ll res = 1e18;
vll dist_u(n+1, 1e18);
dist[u] = 0;
pq.push({0, u});
while(pq.size()){
ll x, d;
tie(d, x) = pq.top();
pq.pop();
if(dist_u[x] < d)continue;
if(x == v){
res = min(res, dist_u[v]); break;
}
for(ll i = 0; i < path[x].size(); i++){
ll nx = path[x][i];
ll wei = w[x][i];
if(dist_u[nx] <= d + wei)continue;
dist_u[nx] = d+wei;
pq.push({dist_u[nx], nx});
}
}
swap(pq, temp);
vll dist_v(n+1, 1e18);
dist[v] = 0;
pq.push({0, v});
while(pq.size()){
ll x, d;
tie(d, x) = pq.top();
pq.pop();
if(dist_v[x] < d)continue;
if(x == u){
res = min(res, dist_v[u]); break;
}
for(ll i = 0; i < path[x].size(); i++){
ll nx = path[x][i];
ll wei = w[x][i];
if(dist_v[nx] <= d + wei)continue;
dist_v[nx] = d+wei;
pq.push({dist_v[nx], nx});
}
}
return res;
}
void solve(){
ll n, m; cin >> n >> m;
ll s, t; cin >> s >> t;
ll u, v; cin >> u >> v;
vector<vll> path(n+1), w(n+1);
while(m--){
ll a, b, c; cin >> a >> b >> c;
path[a].pb(b);
path[b].pb(a);
w[a].pb(c);
w[b].pb(c);
}
cout << min(find_res(n, s, t, u, v, path, w), find_res(n, t, s, u, v, path, w)) << endl;
}
int main(){
ll t = 1; //cin >> t;
while(t--)solve();
}