#include<bits/stdc++.h>
using namespace std;

// dijkstra を用いた dp を考える
// ペタではできない(dijkstra の気持ちを本当に理解していますか?)


struct info{
    int pos;
    string str;
    info(int pos, string str):pos(pos),str(str){}
    info(){}
    bool operator<(const info& a) const{ return str > a.str; }
};

int main(){

   


    while(1){
        int n, a, s, g; cin >> n >> a >> s >> g;
        if(!n) break;
        vector<vector<pair<int, string> > > adj(n);
        for(int i = 0; i < a; i++){
            int u, v; cin >> u >> v;
            string lab; cin >> lab;
            adj[u].push_back({v, lab});
        }

        //dp[pos][len] := pos,len の時に取れる文字列の最小値
        vector<vector<string> > dp(n, vector<string> (6 * 5 * n, "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"));


        //priority queue には {str, pos} の組を入れ、strが小さい順に取り出していく。
        priority_queue<info> pq;
        pq.push(info(s, ""));
        dp[s][0] = "";
        while(!pq.empty()){
            
            int pos = pq.top().pos;
            string str = pq.top().str;
            int len = (int)str.size();
            pq.pop();
            //cout << pos << " " << str << " " << len << endl;
            if(str > dp[pos][len]) continue;

            for(auto x : adj[pos]){
                int next_pos = x.first;
                string next_str = str + x.second;
                int next_len = (int)next_str.size();
                if(next_len >= 6 * 5 * n) continue;
                if(dp[next_pos][next_len] > next_str){
                    dp[next_pos][next_len] = next_str;
                    //cout << "dp[" << next_pos << "][" << next_len << "] = " << dp[next_pos][next_len] << endl;
                    pq.push(info(next_pos, next_str));
                }
            }
        }

        string ans = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz";
        for(int i = 0; i < 6 * 5 * n; i++){
            ans = min(ans, dp[g][i]);
            //cout << dp[g][i] << endl;
        }

        if(ans.size() > 9 * n || ans == "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"){
            cout << "NO" << endl;
        }else{
            cout << ans << endl;
        }
    }

    return 0;
}
