#include using namespace std; int path[101][101]; int path2[101][101]; #define NOPATH -1 #define FALSE 0 #define TRUE 1 void dij(int n, int start, int d[]){ int i, pos,next; int minD; int visited[n]; for( int i=0; i< n; i++){ d[i] = NOPATH; visited[i] = FALSE; } next = start; d[start] = 0; do{ pos = next; visited[pos] = TRUE; minD = NOPATH; for( int i=0; i> n >> m>>s>>g1>>g2 && n ){ for( int i = 0; i < 101; i++ ){ for( int j = 0; j < 101; j++ ){ path[i][j] = (i==j)?0:NOPATH; path2[i][j] = (i==j)?0:NOPATH; } } for( int i = 0; i < m; i++ ){ int b1,b2,c; cin >> b1 >> b2 >> c; b1--; b2--; path2[b1][b2] = c; path[b2][b1] = c; } int as[101]; int ab1[101]; int ab2[101]; dij2( n, s-1, as ); dij( n, g1-1, ab1 ); dij( n, g2-1, ab2 ); unsigned int ans = 10000000; for( int i = 0; i < n; i++ ){ if( as[i] == NOPATH || ab1[i] == NOPATH || ab2[i] == NOPATH ) continue; unsigned int t = as[i] + ab1[i] + ab2[i]; ans = (ans < t ) ? ans : t; // cout << as[i] << ' ' << ab1[i] << ' ' << ab2[i] << endl; } cout << ans << endl; } }