#include <iostream>
#include <cstring>
#include <algorithm>
#include <string>

using namespace std;

int main(){
    ios::sync_with_stdio(0);
    
    int n,m,s,e;
    bool can[40][40];
    string M[40][40],str;
    string loop[40];
    
    while(true){
        cin >> n >> m >> s >> e;
        
        if(n == 0) break;
        
        for(int i = 0;i < n;++i)
            loop[i] = "zzzzzzz";
        
        memset(can,0,sizeof can);
        
        for(int i = 0,u,v;i < m;++i){
            cin >> u >> v >> str;
            
            if(u == v) loop[u] = min(loop[u],str);
            else{
                if(!can[u][v]) M[u][v] = str;
                else M[u][v] = min(M[u][v],str);
                
                can[u][v] = true;
            }
        }
        
        for(int k = 0;k < n;++k)
            for(int i = 0;i < n;++i)
                for(int j = 0;j < n;++j)
                    if(can[i][k] && can[k][j]){
                        if(!can[i][j]) M[i][j] = M[i][k] + M[k][j];
                        else M[i][j] = min(M[i][j],M[i][k] + M[k][j]);
                        
                        can[i][j] = true;
                    }
        
        for(int i = 0;i < n;++i)
            for(int j = 0;j < n;++j)
                if(j != i && can[i][j] && can[j][i])
                    loop[i] = min(loop[i],M[i][j] + M[j][i]);
        
        if(!can[s][e]) cout << "NO\n";
        else{
            bool ok = true;
            
            if(loop[s] + M[s][e] < M[s][e]) ok = false;
            
            for(int i = 0;i < n;++i){
                if(i != s && i != e && can[s][i] && can[i][e] && M[s][i] + loop[i] + M[i][e] < M[s][e])
                    ok = false;
            }
            
            if(!ok) cout << "NO\n";
            else cout << M[s][e] << '\n';
        }
    }
    
    return 0;
}
