//70
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define in "pscnv.in"
#define out "pscnv.out"
#define NMAX 250010
#define INF 9000001
#define ALB 0
#define GRI 1
#define NEGRU 2
typedef struct nod {
int vf;
int cost;
nod* next;
} *PNOD, NOD;
PNOD L[NMAX];
char x[10000000];
int n, nod_p, nod_s, d[NMAX], color[NMAX], q[NMAX], m, minim;
int prim, ultim, suma;
int BF(int,int);
void Read();
void Add(int,int,int);
void Solve();
int main()
{
Read();
Solve();
freopen( out, "w", stdout );
printf( "%d\n", minim );
return 0;
}
void Read()
{
freopen( in, "r", stdin );
scanf( "%d %d %d %d\n", &n, &m, &nod_p, &nod_s );
int v1, v2, cost;
int i;
fread( x, sizeof(char), 10000000, stdin );
char *p;
p = strtok( x, " " );
v1 = atoi( p );
p = strtok ( 0, " " );
v2 = atoi( p );
p = strtok( 0, "\n" );
cost = atoi( p );
Add( v1, v2, cost );
d[v1] = d[v2] = cost;
suma += cost;
for ( i = 2; i <= m; ++i )
{
//fscanf( fin, "%ld%ld%ld", &v1, &v2, &cost );
p = strtok( 0, " " );
v1 = atoi( p );
p = strtok( 0, " " );
v2 = atoi( p );
p = strtok( 0, "\n" );
cost = atoi( p );
Add(v1,v2,cost);
suma += cost;
d[v1] = d[v2] = INF;
//fprintf( fout, "%ld %ld %ld\n", v1, v2, cost );
}
}
void Add(int i, int j, int cost )
{
PNOD p = new NOD;
p->vf = j;
p->cost = cost;
p->next = L[i];
L[i] = p;
}
int BF( int nod, int intmita )
{
PNOD j;
int i;
for ( i = 1; i <= n; ++i )
{
d[i] = INF;
color[i] = ALB;
}
color[nod] = GRI;
prim = ultim = 1;
q[ultim] = nod;
d[nod] = 0;
while ( prim <= ultim )
{
i = q[prim];
for ( j = L[i]; j; j = j->next )
if ( color[j->vf] != NEGRU && j->cost <= intmita )
{
color[j->vf] = GRI;
ultim++;
q[ultim] = j->vf;
d[j->vf] = d[i] + 1;
if ( j->vf ==nod_s ) return 1;
}
prim++;
color[i] = NEGRU;
}
return 0;
}
void Solve()
{
int k, step;
for (step = 1; step <= suma; step <<= 1) ;
for (k = 0; step; step >>= 1)
{
if( k + step <= suma && !BF(nod_p, k + step) ) k += step;
}
minim = k + 1;
}