#include <stdio.h>
#include <set>
#include <queue>
#include <vector>
#include <unordered_set>
#define pb push_back
#define REP(i, n) for(int (i)=0;(i)<(n);(i)++)
using namespace std;
#include <map>
#include <algorithm>
#define mp make_pair
#include <string.h>
int T, F, start, cil;
vector< pair<int, int> > nxt[11111];
long long best[11111];

bool bellman() {
	REP(i, F+2) best[i] = 1LL<<60;
	queue<int> Q;
	unordered_set<int> nQ;
	Q.push(start);
	best[start] = 0;
	REP(j, 500*F+2) { 
		while(!Q.empty()) {
			int u = Q.front();
			Q.pop();
			REP(i, nxt[u].size()) {
				int v = nxt[u][i].first;
				if(best[v] > best[u]+nxt[u][i].second) {
					best[v] = best[u]+nxt[u][i].second;
					nQ.insert(v);
				}
			}
		}
		unordered_set<int>::iterator it = nQ.begin();
		while(it != nQ.end()) {
			Q.push(*it);
			it++;
		}
		nQ.clear();
	}
	if(Q.size() == 0 || best[cil] == 1LL<<60) {
		return false;
	}
	double tmp = best[cil];
	REP(j, F+2) { 
		while(!Q.empty()) {
			int u = Q.front();
			Q.pop();
			REP(i, nxt[u].size()) {
				int v = nxt[u][i].first;
				if(best[v] > best[u]+nxt[u][i].second) {
					if(v == cil) {
						return true;
					}
					best[v] = best[u]+nxt[u][i].second;
					nQ.insert(v);
				}
			}
		}
		unordered_set<int>::iterator it = nQ.begin();
		while(it != nQ.end()) {
			Q.push(*it);
			it++;
		}
		nQ.clear();
	}
	if(best[cil] < tmp) {
		return true;
	}
	return false;
}

int main() {
	while(scanf("%d%d%d%d", &T, &F, &start, &cil) == 4) {
		if(T == 0 && F == 0 && start == 0 && cil == 0)
			break;
		start--; cil--;
		REP(i, F) nxt[i].clear();
		REP(i, T) {
			int u,v;
			double w;
			scanf("%d %d %lf", &u, &v, &w);
			u--; v--;
			nxt[u].pb(mp(v, -(int)(w*1000)));
		}
		if(bellman())
			printf("TRUE\n");
		else
			printf("FALSE\n");
		
	}
	return 0;
}