#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; string dir = "NESW"; int dx[] = {0 , 1 , 0 , -1}; int dy[] = {1 , 0 , -1 , 0}; const int INF = 1<<28; typedef complex cmp_t; struct data_t { cmp_t s , t ; bool isMine ; bool isLocal; data_t(cmp_t ss = cmp_t(), cmp_t tt = cmp_t(), bool f1 = true, bool f2= true) { s=ss;t=tt; isMine = f1 ; isLocal = f2; } }; const double ERROR= 1e-9; cmp_t crossLines(cmp_t o1 , cmp_t l1 , cmp_t o2 , cmp_t l2) { double det = imag(conj(l1)*l2); if(abs(det) > ERROR) { return o1 + l1*imag(conj(o2-o1)*l2)/det; } else throw 0 ; } bool operator < (const cmp_t& p1 , const cmp_t& p2) { if(abs(p1.real()-p2.real())>ERROR) return p1.real() < p2.real(); return p1.imag() < p2.imag() - ERROR; } int main() { int n , m , s , g1 , g2; while(cin>>n>>m>>s>>g1>>g2 && (n||m||s||g1||g2)) { int dat[n][n]; for(int i = 0 ; i < n ;i ++) fill(dat[i] , dat[i] + n , INF); for(int i = 0 ; i < m ; i++) { int b1,b2,c; cin >> b1 >> b2 >> c; dat[b1-1][b2-1] = c ; } for(int i = 0 ; i < n ; i++) dat[i][i] = 0 ; for(int i = 0 ; i < n ; i++) for(int j = 0 ; j < n ; j++) if(dat[j][i]!=INF) for(int k = 0 ; k < n ; k++) { dat[j][k]