#include #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]; queue fr; //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 pomst= adj[ak]; while (! pomst.empty()) { j = pomst.top(); pomst.pop(); // cout <<"mam" << j.v< j.c + d[ak]) { d[j.v] = d[ak] + j.c; if (done[j.v] == 0) { //pridej(j.v); done[j.v] = 1; fr.push(j.v); } // else {zrus(j.v); pridej(j.v);} } } done[ak] = 0; // if (ak == c) break; } cout << d[c]<