#include #include #include #define NEK 1000000000 int d[10002]; int p[10002]; int hash[11000]; struct tab { int uod, udo, del; } tb[11000]; int N,M,S,C; int w(int u, int v) { int i = hash[u]; while( (tb[i].uod == u) && (tb[i].udo != v) ) i++; return (tb[i].udo == v) ? tb[i].del : NEK; } void init_paths(void) { for(int i=0; i<=N; i++) { d[i] = NEK; p[i] = 0; } d[S] = 0; } void relax(int u, int v) { if( d[v] > (d[u]+w(u,v)) ) { d[v] = d[u] + w(u,v); p[v] = u; } } void makehash(void) { for(int i = M; i>0; i--) { hash[tb[i].uod] = i; } } int cmp(const void *a, const void *b) { if( ((tab*)a)->uod < ((tab*)b)->uod) return -1; if( ((tab*)a)->uod == ((tab*)b)->uod) return 0; return 1; } int main(void) { do { scanf("%d %d %d %d", &N, &M, &S, &C); if( (N | M | S | C) == 0 ) return 0; for(int i=1; i<=M; i++) { scanf("%d %d %d", &tb[i].uod, &tb[i].udo, &tb[i].del); } //sort qsort(&tb[1], M, sizeof(tab), cmp); //make hash makehash(); //b-f init_paths(); for(int i=1; i