#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <list>
#include <map>
#include <vector>
#include <set>
#include <stack>
#include <string>
#include <utility>
#include <climits>
using namespace std;


#define DEBUG(x) cout << ">>> " << #x << " : " << x << endl;
#define REP(i,a) for (int i = 0; i < (a) ; ++i)
#define FOR(i,a,b) for (int i = (a); i <= (b) ; ++i)
#define FORD(i,a,b) for (int i = (a); i >= (b) ; --i)
#define FOREACH(it,a) for (__typeof((a).begin()) it = (a).begin(); it !=(a).end();++it)


const int INF = 1<<29;

int T, F, start, end;
int * from;
int * to;
double * len;
double * d;
int main(){
	ios_base::sync_with_stdio(false);
	while (true) {
		cin >> T >> F >> start >> end;
		if (T == 0 && F == 0 && start == 0 && end == 0) break;
		from = new int[T+4];
		to = new int[T+4];
		len = new double[T+4];
		d = new double[F+4];
		REP(i,T) {
			cin >> from[i] >> to[i] >> len[i];
			len[i] *= -1;
		}
		REP(i,F) d[i] = INF;
		d[start] = 0;
		REP(i, F-1) {
			REP(j,T) {
				double dist = d[from[j]] + len[j];
				if (d[to[j]] > dist) d[to[j]] = dist;
			}
		}
		bool negativeCycle = false;
		REP(j,T) {
			double dist = d[from[j]] + len[j];
			if (d[to[j]] > dist) negativeCycle = true; 
		}
		if (negativeCycle && d[end] != INF) cout << "TRUE" << endl;
		else cout << "FALSE" << endl;
	}
	return 0;
}