#define _USE_MATH_DEFINES #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; const long long INF = LLONG_MAX / 4; int main() { int n, m, k, s, t; cin >> n >> m >> k >> s >> t; vector > > edges(n+1); edges[0].push_back(make_pair(-1, s)); edges[n].push_back(make_pair(t, -1)); for(int i=0; i> a >> b >> c; edges[a].push_back(make_pair(b, c)); } vector dp(1, 0); for(int i=0; i > v; for(unsigned j=0; j nextDp(edges[i+1].size(), INF); long long cost = INF; sort(v.begin(), v.end()); for(const auto& t : v){ int pos, k; bool isInput; tie(pos, k, isInput) = t; if(isInput) cost = min(cost, dp[k] - pos); else nextDp[k] = min(nextDp[k], cost + pos); } cost = INF * 2; reverse(v.begin(), v.end()); for(const auto& t : v){ int pos, k; bool isInput; tie(pos, k, isInput) = t; if(isInput) cost = min(cost, dp[k] + pos); else nextDp[k] = min(nextDp[k], cost - pos); } dp.swap(nextDp); } if(dp[0] < INF) cout << dp[0] << endl; else cout << -1 << endl; return 0; }