#include <bits/stdc++.h>
using namespace std;

#define REP(i,n) for(int i = 0; i < (n); ++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 INF 1<<30

typedef pair<int, double> pid;
typedef pair<int, int> pii;
typedef pair<pii, double> piid;


int f, fu, fn, t;

bool visited[5678];

vector<pid> e[5678], e2[5678];
vector<piid> edges;

double dist[5678];

void dfs(int v){
	visited[v] = true;
	for(auto ed : e[v]){
		e2[ed.first].push_back(pid(v, ed.second));
		if(!visited[ed.first])dfs(ed.first);
	}
}

void dfs2(int v){
	visited[v] = true;
	for(auto ed : e2[v]){
		edges.push_back(piid(pii(ed.first, v), -1 * ed.second));
		if(!visited[ed.first])dfs2(ed.first);
	}
}

bool ford(){
	REP(i, f)dist[i] = INF;
	dist[fu] = 0;

	bool changed = true;
	REP(i, f+2){
		bool ch2 = false;
		for(auto ed : edges){
			if(dist[ed.first.second] > dist[ed.first.first]+ed.second){
				ch2 = true;
				dist[ed.first.second] = dist[ed.first.first]+ed.second;
			}
		}
		if(!ch2){
			changed = false;
			break;
		}
	}
	return changed;
}

bool testcase(){
	scanf("%d%d%d%d", &t, &f, &fu, &fn); --fu; --fn;

	if(f==0)return false;

	edges.clear();
	REP(i, f){
		e[i].clear();
		e2[i].clear();
	}

	int a, b;
	double x;

	REP(i, t){
		scanf("%d %d %lf", &a, &b, &x); --a; --b;
		e[a].push_back(pid(b, x));
	}
	
	REP(i, f)visited[i] = false;
	dfs(fu);
	REP(i, f)visited[i] = false;
	dfs2(fn);
	//printf("%d\n", (int)edges.size());

	printf(ford() ? "TRUE\n" : "FALSE\n");


	return true;
}




int main() {
	

	while(testcase());

	return 0;
}