#include<bits/stdc++.h>
#define INF "{"
#define M 500
#define N 40
using namespace std;
typedef pair<int,string> P;
typedef pair<string,int> P1;

int n,m,s,g;
vector<P> G[N];
string d[N][M];

void init(){
  for(int i=0;i<N;i++)
    for(int j=0;j<M;j++) d[i][j]=INF;
  for(int i=0;i<N;i++) G[i].clear();
}

string dijkstra(){
  priority_queue<P1,vector<P1>,greater<P1> > q;
  
  for(int i=0;i<G[s].size();i++){
    int nx=G[s][i].first;
    string ncost=G[s][i].second;
    q.push(P1(ncost,nx));
  }
  
  while(!q.empty()){
    P1 t=q.top(); q.pop();
    string cost=t.first;
    int x=t.second;
    
    if(cost.size()>=M-1)continue;
    
    if(d[x][cost.size()]<=cost)continue;
    
    d[x][cost.size()]=cost;
    
    if(x==g){
      if(cost.size()>=245)break;
      return cost;
    }
    
    for(int i=0;i<G[x].size();i++){
      int nx=G[x][i].first;
      string ncost=cost+G[x][i].second;
      q.push(P1(ncost,nx));
    }
    
  }
  
  return "NO";
}

int main(){
  
  while(1){

    cin>>n>>m>>s>>g;
    if(!n&&!m&&!s&&!g)break;
    
    init();
    
    int a,b;
    string s;
    for(int i=0;i<m;i++){
      cin>>a>>b>>s;
      G[a].push_back(P(b,s));
    }
    
    cout<<dijkstra()<<endl;
    
  }
  
  return 0;
}