#include #include #define maxn 10000 #define moc -1 struct dv { int v, c; }; int n,m,s,c; stack adj[maxn]; int d[maxn]; int done[maxn]; int fr[maxn]; int fb, fe; int popni() { fb++; return fr[fb-1]; } void zrus(int koho) { int akt=fb; while (fr[akt] != koho) akt++; while (akt uloz) {fr[akt] = fr[akt-1]; akt--;} fr[uloz] = koho; } int main() { while (1) { cin >> n >> m >> s>>c; if (n==0 && m==0 && s == 0 && c==0) break; s--; c--; for (int i=0; i> k>> l>> j; pom.v = l -1; pom.c = j; // pom2.v = k-1; // pom2.c = j; adj[k-1].push(pom); // adj[l-1].push(pom2); } for (int i=0; i j.c + d[ak]) { d[j.v] = d[ak] + j.c; if (done[j.v] == 0) { pridej(j.v); done[j.v] = 1;} else {zrus(j.v); pridej(j.v);} } } done[ak] = 2; if (ak == c) break; } cout << d[c]<