# include <stdio.h>
# include <string.h>
# define _fin "pscnv.in"
# define _fout "pscnv.out"
# define maxn 250002
# define maxm 500002
# define maxr 256
# define inf 2000000000
int *v[maxn]; // vecini
int *p[maxn]; // ponderi
int b[maxm], c[maxm], d[maxn];
int n, m, x, y, sol;
int mmin=inf, mmax;
inline void add(int u, int w, int pn)
{
v[u][++v[u][0]] = w;
p[u][ v[u][0]] = pn;
}
# define isdigit(x) ( (x)<=0x39&&(x)>=0x30 )
char br[maxr];
int getnum(int &poz)
{
int ret=0;
while ( isdigit(br[poz]) ) ret=ret*10+br[poz]-0x30, ++poz;
return ret;
}
void readf()
{
int i, a[maxm], aux;
FILE *fin = fopen(_fin, "r");
fscanf(fin, "%d %d %d %d\n", &n, &m, &x, &y);
for(i=1; i<=m; i++)
{
fgets(br, maxr, fin);
aux=0, a[i]=getnum(aux), ++aux, b[i]=getnum(aux), ++aux, c[i]=getnum(aux), ++d[a[i]];
//sscanf(bufrow, "%d %d %d", a+i, b+i, c+i), ++d[ a[i] ];
if ( c[i] < mmin ) mmin = c[i];
else
if ( c[i] > mmax ) mmax = c[i];
}
for(i=1; i<=n; i++)
v[i] = new int [ d[i]+1 ],
p[i] = new int [ d[i]+1 ], v[i][0] = 0;
for(i=1; i<=m; i++)
add(a[i], b[i], c[i]);
fclose(fin);
}
int bf(int k)
{
int i, ss, es, nc;
int a[maxn], d[maxn];
a[ ss=es=1 ] = x;
memset(d, 0, sizeof(d));
d[x] = 1;
while ( ss <= es )
{
nc = a[ss];
if ( nc == y ) break;
for(i=1; i<=v[nc][0]; i++)
if ( p[nc][i] <= k && !d[ v[nc][i] ] )
d[ v[nc][i] ] = 1, a[++es] = v[nc][i];
++ss;
}
return d[y];
}
void solve()
{
int i, step, vmax;
vmax = mmax-mmin;
for(step=1; step<vmax; step <<= 1);
for(i=mmax; step; step>>=1)
if ( i-step >= mmin )
if ( bf(i-step) ) i -= step;
sol = i;
}
void writef()
{
FILE *fout = fopen(_fout, "w");
fprintf(fout, "%d\n", sol), fclose(fout);
}
int main()
{
readf();
solve();
writef();
return 0;
}