#include <iostream>
#include <stdio.h>
#include <math.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
#include<algorithm>
#include<vector>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<list>

using namespace std;

#define FOR(i, a, b) for(int i=a; i<b; ++i)
#define FORD(i, a, b) for(int i=a-1; i>b; --i)

int T, F, A, B;

vector<vector<pair<int, double> > > v;
vector<double> len;
vector<double> vzdial;

vector<int> h0;
vector<int> h1;
vector<double> h2;

void dij(int src, int dst)
{
	set<pair<double, int> > q;
	
	len[src] = 0;

	q.insert(make_pair(src, 0));

	while (!q.empty())
	{
		pair<double, int> top = *q.begin();
		q.erase(q.begin());

		if (len[top.second] <= top.first)
			continue;

		for (int i = 0; i < (int) v[top.second].size(); ++i)
		{
			if (top.first + v[top.second][i].second < len[v[top.second][i].first])
			{
				len[v[top.second][i].first] = top.first + v[top.second][i].second;
				q.insert(make_pair(len[v[top.second][i].first], v[top.second][i].first));
			}
		}
	}
}

int main()
{
	while (1) {
		scanf("%d%d%d%d", &T, &F, &A, &B);
		if (T == 0 && F == 0 && A == 0 && B == 0) break;
		v.clear();
		len.clear();
		vzdial.clear();
		h0.clear();
		h1.clear();
		h2.clear();

		double najdene = false;

		v.resize(F+1);
		len.resize(F+1, 10e12);
		vzdial.resize(F+1, 10e12);
		
 		vzdial[A] = 0;

		FOR(i,0,T) {
			int a, b; double d;
			scanf("%d%d%lf", &a, &b, &d);
			v[b].push_back(make_pair(a, 1));
			h0.push_back(a);
			h1.push_back(b);
			h2.push_back(-d);
		}

		dij(B, A);

		FOR(j, 0, F-1){
			FOR(i, 0, T){
				if(vzdial[h0[i]] + h2[i] < vzdial[h1[i]]){
					vzdial[h1[i]] = vzdial[h0[i]] + h2[i];
				}
			}
		}

			FOR(i, 0, T){
				if(vzdial[h0[i]] + h2[i] < vzdial[h1[i]]){
					if (fabs(len[h1[i]] - 10e12) < 0.1){
						najdene = true;
					}
				}
			}


		cout << (najdene ? "TRUE":"FALSE") << endl;

	}

	return 0;
}