#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("inline")
#include <bits/stdc++.h>
using namespace std;
#define kien long long
//#define int long long
#define pb push_back
#define FOR(i, a, b) for (int i = a;i <= b; i++)
#define FORD(i, a, b) for (int i = a;i >= b; i--)
#define pii pair<int, int>
#define dembit(a) __builtin_popcountll(a)
#define task "kien"
#define fin(x) freopen(x".inp","r",stdin)
#define fou(x) freopen(x".out","w",stdout)
#define debug(x) cout << x << " "
#define down cout << "\n"
const kien MOD = 1e9 + 7;
const int NTEST = 100;
const int Million = 1e6;
const int MXN = 2e5 + 5;
const int INF = 1e9;
mt19937 rd(chrono::high_resolution_clock::now().time_since_epoch().count());
kien rand(kien l, kien r) {
assert(l <= r);
return uniform_int_distribution<kien>(l, r)(rd);
}
kien n, k, m, u, v, h, vis[MXN], trace[MXN], tiep[MXN];
kien maxx, minn, vtr, d[MXN], s, t, r, x, l, timer, ans, add;
vector <pii> dp[MXN];
void dijkstra (int s) {
priority_queue <pii, vector <pii>, greater<pii>> q;
d[s] = 0;
q.push({d[s], s});
while (!q.empty()) {
int u = q.top().second;
q.pop();
if (vis[u]) continue;
vis[u] = 1;
for (auto v : dp[u]) {
if (vis[v.first]) continue;
if (d[v.first] > d[u] + v.second) {
d[v.first] = d[u] + v.second;
trace[v.first] = u;
q.push({d[v.first], v.first});
}
}
}
/// giờ ta phải làm sao để có thể cho đường đi từ s đến t là 0 hết thì ta cần phải ??
vector <int> vec;
int en = t;
while (en != s) {
vec.pb(en);
en = trace[en];
}
vec.pb(s);
reverse(vec.begin(), vec.end());
FOR (i, 0, vec.size() - 2) {
tiep[vec[i]] = vec[i + 1];
}
queue <int> p;
p.push(s);
while (!p.empty()) {
int u = p.front();
p.pop();
for (auto &v : dp[u]) {
if (v.first == tiep[u]) {
p.push(v.first);
v.second = 0;
}
}
}
}
void djk (int s, int t) {
priority_queue <pii, vector <pii>, greater<pii>> q;
d[s] = 0;
q.push({d[s], s});
while (!q.empty()) {
int u = q.top().second;
q.pop();
if (vis[u]) continue;
vis[u] = 1;
for (auto v : dp[u]) {
if (vis[v.first]) continue;
if (d[v.first] > d[u] + v.second) {
d[v.first] = d[u] + v.second;
q.push({d[v.first], v.first});
}
}
}
cout << d[t] << "\n";
}
void solve() {
kien c;
cin >> n >> m;
FOR (i, 1, n) {
d[i] = MOD;
vis[i] = 0;
}
cin >> s >> t;
cin >> l >> r;
FOR (i, 1, m) {
cin >> u >> v >> c;
dp[u].pb({v, c});
dp[v].pb({u, c});
}
dijkstra(s);
FOR (i, 1, n) {
d[i] = MOD;
vis[i] = 0;
}
djk(l, r);
// cout << "gd";
}
main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
if (fopen(task".inp", "r")) {
fin(task); fou(task);
}
int tt = 1;
while(tt--) {
solve();
}
cerr << "\n" << 1.0 * clock() / CLOCKS_PER_SEC << "s ";
}