#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 3503;
int n, m, s[5];
struct Edge
{
int from, to, next, w;
} edge[N * N];
int head[N], cnt = 0;
int dis[5][N];
void add(int u, int v, int w)
{
edge[++cnt].to = v;
edge[cnt].from = u;
edge[cnt].w = w;
edge[cnt].next = head[u];
head[u] = cnt;
}
struct Edge0
{
int to, next, w, is;
} edge0[N * N];
int head0[N], cnt0 = 0;
void add0(int u, int v, int w, int is)
{
edge0[++cnt0].to = v;
edge0[cnt0].w = w;
edge0[cnt0].next = head0[u];
edge0[cnt0].is = is;
head0[u] = cnt0;
}
queue<int> q;
int vis[N], in[N];
void dij()
{
memset(dis, 0x3f3f3f3f3f3f, sizeof(dis));
for (int k = 1; k <= 4; k++)
{
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
memset(vis, 0, sizeof(vis));
q.push(make_pair(0, s[k]));
dis[k][s[k]] = 0;
// cout << k << ' ' << s[k] << ' ' << q.top().first << ' ' << q.top().second << endl;
while (!q.empty())
{
int x = q.top().second;
q.pop();
if (vis[x])
{
continue;
}
vis[x] = 1;
// cout << "x=" << x << endl;
for (int i = head[x]; i; i = edge[i].next)
{
int y = edge[i].to;
int w = edge[i].w;
// cout << "dis[" << k << "][" << y << "]=" << dis[k][y] << ' ' << "dis[" << k << "][" << x << "]=" << dis[k][x] << " w=" << w << endl;
if (dis[k][y] > dis[k][x] + w)
{
dis[k][y] = dis[k][x] + w;
q.push(make_pair(dis[k][y], y));
}
// cout << "abab " << "dis[" << k << "][" << y << "]=" << dis[k][y] << ' ' << "dis[" << k << "][" << x << "]=" << dis[k][x] << " w=" << w << endl;
}
}
}
}
void build()
{
// cout << "res=\n";
// for (int i = 1; i <= 4; i++)
// {
// cout << dis[i][s[i]] << endl;
// }
for (int i = 1; i <= cnt + 4; i++)
{
int u = edge[i].from, v = edge[i].to, w = edge[i].w;
if (dis[1][u] + w + dis[2][v] == dis[1][s[2]])
{
if (dis[3][u] + w + dis[4][v] == dis[3][s[4]] || dis[3][v] + w + dis[4][u] == dis[4][s[3]])
{
add0(u, v, w, 1);
}
else
{
add0(u, v, w, 0);
}
in[v]++;
}
}
}
int dp[N];
void tp()
{
queue<int> q;
q.push(s[1]);
while (!q.empty())
{
int u = q.front();
q.pop();
for (int i = head0[u]; i; i = edge0[i].next)
{
int v = edge0[i].to, w = edge0[i].w, is = edge0[i].is;
in[v]--;
dp[v] = max(dp[v], dp[u] + is * w);
if (!in[v])
{
q.push(v);
}
}
}
}
signed main()
{
cin >> n >> m;
cin >> s[1] >> s[2] >> s[3] >> s[4];
for (int i = 1; i <= m; i++)
{
int u, v, w;
cin >> u >> v >> w;
add(u, v, w);
add(v, u, w);
}
dij();
build();
tp();
cout << dp[s[2]];
return 0;
}