#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ff first
#define ss second
#define sz(a) (int)(a).size()
#define all(a) (a).begin(),(a).end()
#define rall(a) (a).rbegin(),(a).rend()
#define pb push_back
vector<vector<pair<int, int>>> adj;
int ans;
int s, t;
vector<int> dis;
vector<int> dis2;
vector<int> dis3;
void dfs(int node, int mn1, int mn2) {
ans = min(ans, mn1 + mn2);
if(node == s) return;
for(auto &[a, b] : adj[node]) {
if(dis[a] + b == dis[node]) {
dfs(a, min(mn1, dis2[a]), min(mn2, dis3[a]));
}
}
}
void solve() {
int n, m;
cin >> n >> m;
int u, v;
adj.assign(n + 1, {});
dis.assign(n + 1, -1);
dis2.assign(n + 1, -1);
dis3.assign(n + 1, -1);
cin >> s >> t >> u >> v;
for(int i = 1; i <= m; i++) {
int a, b, c;
cin >> a >> b >> c;
adj[a].pb({b, c});
adj[b].pb({a, c});
}
priority_queue<pair<int, int>> q;
queue<int> p;
q.push({0, s});
while(!q.empty()) {
int u = q.top().ss;
int t = q.top().ff;
q.pop();
if(dis[u] != -1) continue;
dis[u] = -t;
for(auto &[a, b] : adj[u]) {
if(dis[a] == -1) q.push({t - b, a});
}
}
q.push({0, v});
while(!q.empty()) {
int u = q.top().ss;
int t = q.top().ff;
q.pop();
if(dis2[u] != -1) continue;
dis2[u] = -t;
for(auto &[a, b] : adj[u]) {
if(dis2[a] == -1) q.push({t - b, a});
}
}
q.push({0, u});
while(!q.empty()) {
int u = q.top().ss;
int t = q.top().ff;
q.pop();
if(dis3[u] != -1) continue;
dis3[u] = -t;
for(auto &[a, b] : adj[u]) {
if(dis3[a] == -1) q.push({t - b, a});
}
}
ans = dis2[u];
dfs(t, dis2[t], dis3[t]);
cout << ans << "\n";
}
signed main() {
ios_base::sync_with_stdio(0);cin.tie(0);
int t = 1;
// cin >> t;
while(t--) solve();
return 0;
}