// parsare
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define in "pscnv.in"
#define out "pscnv.out"
#define NMAX 250005
#define MMAX 500005
#define ALB 0
#define GRI 1
#define NEGRU 2
#define maxim(a,b) ((a)>(b)?(a):(b))
typedef struct nod {
int vf,cost;
struct nod * next;
} *PNOD, NOD;
PNOD L[NMAX];
int q[NMAX*10];
int K, N, M, X, Y;
int color[NMAX];
char buffer[10000000];
void Add( int i, int j, int cost)
{
PNOD p = (PNOD)calloc( 1, sizeof(NOD) );
p->vf = j;
p->cost = cost;
p->next = L[i];
L[i] = p;
}
int BF ( int max )
{
int p, u, i;
PNOD j;
q[p = u = 1] = X;
memset ( color, 0, sizeof(color) );
while ( p <= u )
{
i = q[p];
for ( j = L[i]; j; j = j->next )
if ( color[j->vf] != NEGRU && j->cost <= max )
{
q[++u] = j->vf;
color[j->vf] = GRI;
if ( j->vf == Y ) return 1;
}
p++;
color[i] = NEGRU;
}
return 0;
}
int main ( void )
{
freopen ( in, "r", stdin );
freopen ( out, "w", stdout );
scanf ( "%d %d %d %d\n", &N, &M, &X, &Y );
int i, j, cost, last = 0;
//int bl, br, bm;
fread ( buffer, sizeof(char), 10000000, stdin );
char sep[] = " \n";
char *p;
p = strtok ( buffer, sep );
i = atoi ( p );
p = strtok ( 0, sep );
j = atoi ( p );
p = strtok ( 0, sep );
cost = atoi ( p );
Add ( i, j, cost );
M--;
for ( ; M; --M )
{
p = strtok ( 0, sep );
i = atoi ( p );
p = strtok ( 0, sep );
j = atoi ( p );
p = strtok ( 0, sep );
cost = atoi ( p );
Add ( i ,j, cost );
K = maxim ( K, cost );
}
/*
for ( bl = 0, br = K; bl <= br; )
{
bm = (bl + ((br-bl)>>1));
if ( BF(bm) ) last = bm, br = bm-1;
else bl = bm+1;
}
*/
int step;
for ( step = 1; step <= K; step <<= 1 );
for ( i = 0; step; step >>= 1 )
{
if ( i + step <= K && !BF( i + step ) ) i += step;
}
last = i + 1;
printf ( "%d\n", last );
return 0;
}