#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>
#include <queue>
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;
bool * fs;
bool * fe;
int * neiCnt;
int * transCnt;
int ** nei;
int ** trans;

void fromStart() {
	queue<int> q;
	q.push(start);
	fs = new bool[F+4];
	REP(i,F) fs[i] = false;
	fs[start] = true;
	while(!q.empty()) {
		int cur = q.front(); q.pop();
		REP(i,neiCnt[cur]) {
			int next = nei[cur][i];
			if (!fs[next]) {
				fs[next] = true;
				q.push(next);
			}
		}
	}
}

void fromEnd() {
	queue<int> q;
	q.push(end);
	fe = new bool[F+4];
	REP(i,F) fe[i] = false;
	fe[end] = true;
	while(!q.empty()) {
		int cur = q.front(); q.pop();
		//DEBUG(cur)
		//DEBUG(transCnt[cur])
		REP(i,transCnt[cur]) {
			int next = trans[cur][i];
			if (!fe[next]) {
				fe[next] = true;
				q.push(next);
			}
		}
	}
}


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;
		start--; end--;
		nei = new int * [F+4];
		trans = new int * [F+4];
		neiCnt = new int [F+4];
		transCnt = new int [F+4];
		REP(i,F) {
			neiCnt[i] = 0;
			transCnt[i] = 0;
			nei[i] = new int[F+4];
			trans[i] = new int[F+4];
		}
		from = new int[T+4];
		to = new int[T+4];
		to = 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];
			from[i]--; to[i]--;
			nei[from[i]][neiCnt[from[i]]++] = to[i];
			trans[to[i]][transCnt[to[i]]++] = from[i];
			len[i] *= -1;
		}
		//REP(i,F) DEBUG(transCnt[i])
		fromStart();
		fromEnd();
		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 && fe[to[j]] && fs[to[j]]) negativeCycle = true; 
		}
		if (negativeCycle) cout << "TRUE" << endl;
		else cout << "FALSE" << endl;
	}
	return 0;
}