#include <bits/stdc++.h>
#define FOR(i, a, b) for (int i = a, _b = (b); i <= _b; i++)
#define ROF(i, a, b) for (int i = a, _b = (b); i >= _b; i--)
#define REP(i, n) for (int i = 0, _n = (n); i < _n; i++)
#define szx(x) (int)(x).size()
#define all(x) (x).begin(), (x).end()
#define pb push_back
#define ll long long
#define fi first
#define se second
#define pii pair<int, int>
#define pll pair<ll, ll>
#define pil pair<int, ll>
#define pli pair<ll, int>
#define mod 1000000007
using namespace std;
int n, m, s, t, u, v;
const int MAX = 1e5 + 5;
vector<pil> g[MAX];
const ll inf = 1e18;
void dijkstra(vector<ll>& dist, int s) {
dist[s] = 0;
priority_queue<pli, vector<pli>, greater<pli>> pq;
pq.push({0, s});
while (!pq.empty()) {
int a = pq.top().se;
ll d = pq.top().fi;
pq.pop();
if (d != dist[a]) continue;
for (pii p : g[a]) {
int b = p.fi;
int w = p.se;
if (d + w < dist[b]) {
dist[b] = d + w;
pq.push({d + w, b});
}
}
}
}
void solve() {
cin >> n >> m >> s >> t >> u >> v;
FOR(i, 1, m) {
int a, b, c;
cin >> a >> b >> c;
g[a].pb({b, c});
g[b].pb({a, c});
}
vector<ll> distu(n + 1, inf), distv(n + 1, inf);
dijkstra(distu, u);
dijkstra(distv, v);
vector<ll> dist(n + 1, inf);
vector<vector<int>> rdag(n + 1);
dist[s] = 0;
priority_queue<pli, vector<pli>, greater<pli>> pq;
pq.push({0, s});
while (!pq.empty()) {
int a = pq.top().se;
ll d = pq.top().fi;
pq.pop();
if (d != dist[a]) continue;
for (pii p : g[a]) {
int b = p.fi;
int w = p.se;
if (d + w < dist[b]) {
dist[b] = d + w;
rdag[b] = {a};
pq.push({d + w, b});
} else if (d + w == dist[b])
rdag[b].pb(a);
}
}
vector<vector<int>> dag(n + 1);
vector<int> in(n + 1, -1);
queue<int> q;
q.push(t);
while (!q.empty()) {
int a = q.front();
q.pop();
if (in[a] == -1) in[a] = 0;
for (int b : rdag[a]) {
q.push(b);
dag[b].pb(a);
in[a]++;
}
}
FOR(i, 1, n) if (in[i] == 0) q.push(i);
vector<int> topo{-1};
while (!q.empty()) {
int a = q.front();
q.pop();
topo.pb(a);
for (int b : dag[a])
if (--in[b] == 0) q.push(b);
}
ll ans = distu[v];
vector<ll> minu(n + 1, inf), minv(n + 1, inf);
FOR(i, 1, szx(topo) - 1) {
int a = topo[i];
ans = min(distu[a] + distv[a], ans);
minu[a] = distu[a];
minv[a] = distv[a];
for (int b : rdag[a]) {
minu[a] = min(minu[a], minu[b]);
minv[a] = min(minv[a], minv[b]);
}
ans = min({ans, distv[a] + minu[a], distu[a] + minv[a]});
}
cout << ans;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(nullptr);
// freopen("main.in", "r", stdin);
// freopen("main.out", "w", stdout);
int t = 1;
// cin >> t;
while (t--) { solve(); }
}