#include <cstdio>
#include <vector>

using namespace std;

struct EDGE{ int to, w; };

vector<EDGE> G[1100];
int N, M, S, D, T, P[1100], done[1100];
int min(int a, int b){ return a>b?b:a; }
inline int max_e(void)
{
    int max_id = 0;
    for(int i = 1 ; i <= N ; i++ )
        if( !done[i] && P[i] > P[max_id] ) max_id = i;
    return max_id;
}
int main()
{
    freopen(".14.in","r",stdin);
    freopen(".14.out","w",stdout);
    scanf("%d%d%d%d%d",&N,&M,&S,&D,&T);
    for(int i = 0 ; i < M ; i++ )
    {
        int a, b, w;
        scanf("%d%d%d",&a,&b,&w);
        G[a].push_back({b,w});
        G[b].push_back({a,w});
    }
    for(int i = 0 ; i < G[S].size() ; i++ )
        P[G[S][i].to] = G[S][i].w;
    done[S] = true;
    while(!done[D])
    {
        int m = max_e();
        done[m] = true;
        for(int i = 0 ; i < G[m].size() ; i++ )
            if( !done[G[m][i].to] && P[G[m][i].to] < min(P[m],G[m][i].w) )
                P[G[m][i].to] = min(P[m],G[m][i].w);
    }
    printf("%d\n", T/(P[D]-1)+(bool)(T%(P[D]-1)));
}
