#include <cstdio>
#include <cstring>
#include <vector>
#include <cstdlib>
#define NMAX 200200
#define CMAX 200200
#define max(a, b) ((a) > (b) ? (a):(b))
#define mod(a) ( ((a) >= 200020) ? ((a)-CMAX):(a) )
using namespace std;
vector<int> A[NMAX];
vector<int> K[NMAX];
int N, M, X, Y, Kmin, F[NMAX], C[CMAX+10], G[NMAX];
char buf[NMAX*50];
int main()
{
int i, j, c, k, hi, lo, mij, m = 0, p1, p2, ok, nod;
FILE *f = fopen("pscnv.in", "rt");
setbuffer(f,buf,sizeof(buf));
fscanf(f,"%d %d %d %d", &N, &M, &X, &Y);
while (M--)
{
fscanf(f,"%d %d %d", &i, &j, &c);
G[i]++; G[j]++;
A[i].push_back(j);
A[j].push_back(i);
K[i].push_back(c);
K[j].push_back(c);
m = max(m, c);
}
for (lo = 0, hi = m; lo <= hi; lo++)
{
mij = (hi+lo)>>1;
memset(C, 0, sizeof(C));
C[p1 = 0] = X; p2 = 1;
memset(F, 0, sizeof(F));
for (ok = 0, F[X] = 1; p1 != p2 && ok == 0; )
{
for (nod = C[p1], m = G[nod], i = 0; i < m && ok == 0; i++)
if (F[ A[nod][i] ] == 0 && K[nod][i] <= mij)
F[ A[nod][i] ] = 1, C[p2] = A[nod][i],
ok = (A[nod][i] == Y), p2 = mod(p2+1);
p1 = mod(p1+1);
}
if (ok == 1) hi = mij-1, Kmin = mij;
else lo = mij+1;
}
freopen("pscnv.out", "w", stdout);
printf("%d\n", Kmin);
return 0;
}