#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;
void solve() {
int n, m;
cin >> n >> m;
int s, t;
int u, v;
adj.assign(n + 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});
}
vector<int> dis(n + 1, -1);
vector<int> dis2(n + 1, -1);
vector<int> can(n + 1);
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});
}
}
can[t] = 1;
p.push(t);
while(!p.empty()) {
int u = p.front();p.pop();
for(auto &[a, b] : adj[u]) {
if(!can[a] && dis[a] + b == dis[u]) {
can[a] = 1;
p.push(a);
}
}
}
int ans = LLONG_MAX;
for(int i = 1; i <= n; i++) {
if(can[i]) ans = min(ans, dis2[i]);
}
cout << ans << "\n";
}
signed main() {
ios_base::sync_with_stdio(0);cin.tie(0);
int t = 1;
// cin >> t;
while(t--) solve();
return 0;
}