#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAX = 2e6 + 5;
const int MOD = 1e9 + 7;
int n, m, u1, u2, v;
int dist1[MAX], dist2[MAX], dist3[MAX];
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
pair<int, int> start, fin;
vector<pair<int, int>> g[MAX], rev_g[MAX];
void DIJKSTRA(int start, int dist[], vector<pair<int, int>> g[MAX]) {
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
    for(int i = 1; i <= n; i++) dist[i] = 2e18;
    dist[start] = 0;
    q.push({dist[start], start});
    while(!q.empty()) {
        int cost = q.top().first;
        int u = q.top().second;
        q.pop();
        if(cost != dist[u]) continue;
        for(auto e : g[u]) {
            int v = e.first;
            int w = e.second;
            if(dist[v] > dist[u] + w) {
                dist[v] = dist[u] + w;
                q.push({dist[v], v});
            }
        }
    }
}
signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    if(fopen("gay.inp", "r")) {
        freopen("gay.inp", "r", stdin);
        freopen("gay.out", "w", stdout);
    }
    cin >> n >> m >> u1 >> u2 >> v;
    for(int i = 1; i <= m; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        g[u].push_back({v, w});
        rev_g[v].push_back({u, w});
    }
    DIJKSTRA(u1, dist1, g);
    DIJKSTRA(u2, dist2, g);
    DIJKSTRA(v, dist3, rev_g);
    int ans = 2e18;
    for(int i = 1; i <= n; i++) 
        if(dist1[i] != 2e18  && dist2[i] != 2e18 && dist3[i] != 2e18)
            ans = min(ans, dist1[i] + dist2[i] + dist3[i]);
    if(ans == 2e18) cout << -1;
    else cout << ans;
    return 0;
}
