#include #include #include #include #include using namespace std; #define N 1001 int d[N][N]; int cost[N][N]; int done[N][N]; typedef struct{ int i, j; } H; H list[N*N]; int n_list; // 123456... int cmp( const void *p1, const void *p2 ) { H *pp1 = (H*)p1; H *pp2 = (H*)p2; if( d[pp1->i][pp1->j] > d[pp2->i][pp2->j] ) return 1; if( d[pp1->i][pp1->j] < d[pp2->i][pp2->j] ) return -1; return 0; } int n,m,s,g1,g2; void Add( int i, int j ){ if( i > j ){ int t = i; i = j; j = t; } if( done[i][j] ) return; // printf( "Added %d,%d\n", i, j ); done[i][j] = done[j][i] = 2; list[n_list].i = i; list[n_list].j = j; n_list ++; } void Update( int i, int j ){ for( int t = 1; t <= n; t ++ ){ if( cost[i][t] >= 0 ) Add( i, t ); if( cost[j][t] >= 0 ) Add( j, t ); } } void Sort(int i) { if( i > 0 ){ memmove( list, list + 1, sizeof(H) * (n_list - 1) ); n_list --; } qsort( list, n_list, sizeof(H), cmp ); } int main(void) { while(1){ scanf( "%d%d%d%d%d", &n, &m, &s, &g1, &g2 ); if( n == 0 && m == 0 && s == 0 && g1 == 0 && g2 == 0 ) break; memset( d, 0xff, sizeof(d) ); memset( done, 0x00, sizeof(done) ); memset( cost, 0xff, sizeof(cost) ); for( int i = 0; i < m; i ++ ){ int f, t, c; scanf( "%d%d%d", &f, &t, &c ); cost[f][t] = c; } d[s][s] = 0; done[s][s] = 1; list[0].i = s; list[0].j = s; n_list = 1; while (n_list > 0){ int i = list[0].i; int j = list[0].j; int is_update = 0; for( int t = 1; t <= n; t ++ ){ if( cost[i][t] >= 0 ){ int d2; if( t == j ) d2 = d[i][j]; else d2 = d[i][j] + cost[i][t]; if( d[t][j] < 0 ){ d[t][j] = d[j][t] = d2; Add( t, j ); } else if( d2 < d[t][j] ){ d[t][j] = d[j][t] = d2; } } if( cost[j][t] >= 0 ){ int d2; if( t == i ) d2 = d[i][j]; else d2 = d[i][j] + cost[j][t]; if( d[t][i] < 0 ){ d[t][i] = d[i][t] = d2; Add( t, i ); } else if( d2 < d[t][i] ){ d[t][i] = d[i][t] = d2; } } } done[i][j] = done[j][i] = 1; // printf( "%d, %d -> %d\n", i, j, d[i][j] ); if( i == g1 && j == g2 ) break; if( j == g1 && i == g2 ) break; Sort(1); } printf( "%d\n", d[g1][g2] ); } return 0; }