#include using namespace std; typedef long long ll; typedef vector vi; typedef vector vl; typedef pair pii; typedef pair pll; typedef int _loop_int; #define REP(i,n) for(_loop_int i=0;i<(_loop_int)(n);++i) #define FOR(i,a,b) for(_loop_int i=(_loop_int)(a);i<(_loop_int)(b);++i) #define FORR(i,a,b) for(_loop_int i=(_loop_int)(b)-1;i>=(_loop_int)(a);--i) #define DEBUG(x) cout<<#x<<": "< P; int n,m,k,s,t; int a[252521], b[252521], c[252521]; vi po[252521]; map vrtx; vector g[425252]; ll dist[425252]; int main(){ scanf("%d%d%d%d%d",&n,&m,&k,&s,&t); REP(i,m)scanf("%d%d%d",a+i,b+i,c+i); po[0].push_back(s); po[n-1].push_back(t); REP(i,m){ a[i]--; po[a[i]].push_back(b[i]); po[a[i]+1].push_back(c[i]); } int it = 0; REP(i,n){ sort(ALL(po[i])); po[i].erase(unique(ALL(po[i])), po[i].end()); REP(j,po[i].size()){ vrtx[pii(i,po[i][j])] = it++; } REP(j,po[i].size()-1){ int from = vrtx[pii(i,po[i][j])]; int to = vrtx[pii(i,po[i][j+1])]; int sa = po[i][j+1] - po[i][j]; g[from].push_back(pii(to,sa)); g[to].push_back(pii(from,sa)); } } REP(i,m){ int from = vrtx[pii(a[i], b[i])]; int to = vrtx[pii(a[i]+1, c[i])]; g[from].push_back(pii(to,0)); } const ll INF = 1e18; REP(i,it)dist[i] = INF; priority_queue Q; int start = vrtx[pii(0,s)]; dist[start] = 0ll; Q.push(pll(-dist[start], start)); while(!Q.empty()){ ll d = Q.top().first; int pos = Q.top().second; Q.pop(); if(dist[pos] != -d)continue; for(pii P : g[pos]){ int to = P.first; int cost = P.second; if(dist[pos] + cost < dist[to]){ dist[to] = dist[pos] + cost; Q.push(pll(-dist[to], to)); } } } int goal = vrtx[pii(n-1,t)]; if(dist[goal] == INF){ dist[goal] = -1; } cout<