#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
const int mx = 1e5 + 5;
const ll inf = 2e18;
ll dp[2][mx], du[mx], dv[mx], d[mx];
ll ans;
bool vis[mx];
vector<pii> adj[mx];
int n, m;
void dij1(int s, ll d[])
{
fill(vis, vis + n, false);
priority_queue<pii, vector<pii>, greater<pii>> pq;
pq.push({0, s});
d[s] = 0;
while (!pq.empty())
{
auto t = pq.top();
pq.pop();
ll dd = t.first, cur = t.second;
if (vis[cur])
continue;
vis[cur] = true;
d[cur] = dd;
for (auto u : adj[cur])
{
int to = u.first, w = u.second;
pq.push({dd + w, to});
}
}
}
void dij2(int s, int t)
{
fill(vis, vis + n, false);
fill(dp[0], dp[0] + n, inf);
fill(dp[1], dp[1] + n, inf);
vector<ll> d(n, inf);
priority_queue<pair<ll, pii>, vector<pair<ll, pii>>, greater<pair<ll, pii>>> pq;
pq.push({0, {s, 0}});
while (!pq.empty())
{
auto t = pq.top();
pq.pop();
ll dd = t.first, cur = t.second.first, par = t.second.second;
if (!vis[cur])
{
vis[cur] = true;
d[cur] = dd;
dp[0][cur] = min({dp[0][cur], du[cur], dp[0][par]});
dp[1][cur] = min({dp[1][cur], dp[0][cur] + dv[cur], dp[1][par]});
for (auto u : adj[cur])
pq.push({dd + u.second, {u.first, cur}});
}
else if (dd == d[cur])
{
dp[0][cur] = min({dp[0][cur], du[cur], dp[0][par]});
dp[1][cur] = min({dp[1][cur], dp[0][cur] + dv[cur], dp[1][par]});
}
}
ans = min(ans, dp[1][t]);
}
int main()
{
cin >> n >> m;
int s, t, u, v;
cin >> s >> t >> u >> v;
s--, t--, u--, v--;
for (int i = 0; i < m; i++)
{
int a, b, c;
cin >> a >> b >> c;
adj[--a].push_back({--b, c});
adj[b].push_back({a, c});
}
dij1(u, du);
dij1(v, dv);
ans = du[v];
dij2(s, t);
dij2(t, s);
cout << ans << '\n';
return 0;
}