#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;
F(i,0,F-1){
F(u,0,F){
F(j,0,(int)AdjList[u].size()){
id v = AdjList[u][j];
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){
printf("TRUE\n");
}else{
printf("FALSE\n");
}
}
return 0;
}Diff to submission s974