#include #include #include #include #include using namespace std; typedef long long lint; typedef vectorvi; typedef pairpii; typedef pairpli; #define rep(i,n)for(int i=0;ibank; vectorsky[N]; vector >g; int regist(int a,int b){ if(bank.count(pii(a,b))){ return bank[pii(a,b)]; } int s=bank.size(); bank[pii(a,b)]=s; sky[a].push_back(pii(b,s)); return s; } int main(){ int n,m,k,s,t; cin>>n>>m>>k>>s>>t; vi ds(m),es(m); rep(i,m){ int a,b,c; cin>>a>>b>>c; a--; int d=regist(a,b); int e=regist(a+1,c); ds[i]=d; es[i]=e; } int si=regist(0,s); int ti=regist(n-1,t); int gs=bank.size(); g=vector >(gs); rep(i,m)g[ds[i]].push_back(pii(es[i],0)); rep(i,n){ sort(sky[i].begin(),sky[i].end()); if(sky[i].size()==0)continue; rep(j,sky[i].size()-1){ pii vvh=sky[i][j]; int v=vvh.second; int vh=vvh.first; pii wwh=sky[i][j+1]; int w=wwh.second; int wh=wwh.first; g[v].push_back(pii(w,wh-vh)); g[w].push_back(pii(v,wh-vh)); } } vectordis(gs,I); priority_queue,greater >q; q.push(pli(0,si)); while(q.size()>0){ pli dw=q.top();q.pop(); lint d=dw.first; int v=dw.second; if(dis[v]<=d)continue; dis[v]=d; for(pii e:g[v]){ int w=e.first; long nd=d+e.second; if(dis[w]<=nd)continue; dis[w]=nd+1; q.push(pli(nd,w)); } } cout<<(dis[ti]==I?-1:dis[ti])<