#include <bits/stdc++.h>

using namespace std;

#define F(i,L,U) for((i)=(L);(i)<(U);(i)++)
#define FE(i,L,U) for((i)=(L);(i)<=(U);(i)++)
typedef vector<int> vi;
typedef pair<int, int> ii;
typedef pair<int, double> id;
typedef vector<ii> vii;
typedef vector<id> vid;

#define INF 1000000000

// class UF{
// public:
//   vi p, rank, setSize, m;
//   int numSets;
//   
//   UF(int N){
//     m.assign(N, 0);
//     setSize.assign(N, 1); numSets = N; rank.assign(N,0);
//     p.assign(N,0); 
//     for(int i = 0; i < N; i++) {
//       p[i] = i;
//       m[i] = i;
//     }
//     
//   }
//   
//   int findSet(int i){
//     
//     if (p[i] == i){
//       return i;
//       
//     }else{
//      int x =  findSet(p[i]);
//      m[i] = max(m[i], m[x]);
//      return p[i] = x;
//      
//     }
//     
// //     return (p[i] == i) ? i : (p[i] = findSet(p[i]););
//     
//   }
//   
//   bool isSameSet(int i, int j){
//     return findSet(i) == findSet(j);
//   }
//   
//   void unionSet(int i, int j){
//     if (!isSameSet(i,j)){
//       numSets--;
//       int x = findSet(i), y = findSet(j);
//       
//       if (rank[x] > rank[y]){
// 	m[x] = max(m[x], m[y]);
// 	p[y] = x; setSize[x] += setSize[y];
//       }else{
// 	m[y] = max(m[x], m[y]);
// 	p[x] = y; setSize[y] += setSize[x];
// 	
// 	if (rank[x] == rank[y]) rank[y]++;
//       }
//       
// 
//     }
//     
//   }
//   
// };


#define LINE(line) fgets(line, sizeof(line), stdin)

int T, F, F_u, F_n;

vector<vid> AdjList;


int main(){
  int i, j, k, u, v;
  double w;
  
  while(scanf("%d %d %d %d", &T, &F, &F_u, &F_n), (T||F||F_u||F_n)){

    F_u--;
    F_n--;
    
    AdjList.assign(F, vid());
    
    F(i,0,T){
      scanf("%d %d %lf", &u, &v, &w);
      u--;
      v--;
      w *= -1;
      AdjList[u].push_back(id(v, w));
    }
    
    vector<double> dist(F, INF); dist[F_u] = 0.0;
    vi p, a;
    p.assign(F, -1);
     a.assign(F, -1);
    F(i,0,F-1){
      F(u,0,F){
	 F(j,0,(int)AdjList[u].size()){
	    id v = AdjList[u][j];
	    if (dist[v.first] > dist[u] + v.second ){
	      dist[v.first] = dist[u] + v.second;
	      p[v.first] = u;
	    }
	    
// 	    dist[v.first] = fmin(dist[v.first], dist[u] + v.second);
	 }
      } 
    }
    
//     if (dist[F_n] == (double) INF){
//       printf("FALSE\n");
//       continue;
//     }
    
    bool has = false;
    
     F(u,0,F){
	 F(j,0,(int)AdjList[u].size()){
	    id v = AdjList[u][j];
	    if (dist[v.first] > dist[u] + v.second ){
	      has = true;
	    }
	 }
      } 
    
    if (has){
      int tmp = p[F_n];
      
      
    bool  hasaa = false;
    while(tmp != -1){
      if (a[tmp] != -1){
	hasaa = true;
	break;
      }
      a[tmp] = tmp;
//       printf(" %d", tmp);
      tmp = p[tmp];
    }
//     printf("\n");
      
    
    if (hasaa){
      printf("TRUE\n");
      
    }else{
      printf("FALSE\n");
    }
      
    }else{
      printf("FALSE\n");
    }
  }


  return 0;
}

Diff to submission s982