#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <limits.h>
using namespace std;

int main()
{
    int numOfRows,numOfPlankton,inputID,outputID;
    double *offers=new double[5001];
    int edgex[10001];
    int edgey[10001];
    double edgeRate[10001];
    while(scanf("%d%d%d%d",&numOfRows,&numOfPlankton,&inputID,&outputID))
    {
        if(numOfRows==0&&numOfPlankton==0&&inputID==0&&outputID==0)
        {
            return 0;
        }
        int from,to;
        double rate;
        memset(offers,0,sizeof(double)*numOfPlankton);
        int m=0;
        for(int i=numOfRows; i>0; i--)
        {
            scanf("%d%d%lf",&from,&to,&rate);
            edgex[m]=from-1;
            edgey[m]=to-1;
            edgeRate[m]=rate;
            m++;
        }
        offers[inputID-1]=0;
        for(int i=0; i<numOfPlankton; i++)
        {
            for(int j=0; j<numOfPlankton; j++)
            {
                for(int k =0; k < numOfRows; k++)
                {
                    if(offers[edgex[k]] + edgeRate[k] > offers[edgey[k]])
                    {
                        offers[edgey[k]] = offers[edgex[k]] + edgeRate[k];
                    }
                }
            }
        }
        int result=offers[outputID-1];
        for(int i=0; i<numOfPlankton; i++)
        {
            for(int j=0; j<numOfPlankton; j++)
            {
                for(int k =0; k < numOfRows; k++)
                {
                    if(offers[edgex[k]] + edgeRate[k] > offers[edgey[k]])
                    {
                        offers[edgey[k]] = offers[edgex[k]] + edgeRate[k];
                    }
                }
            }
        }
        if(result<offers[outputID-1])
        {
            printf("TRUE\n");
        }
        else
        {
            printf("FALSE\n");
        }





    }
    delete []offers;
    return 0;
}