#include <cstring>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
const int INF=1e9;
struct node
{
int to,w,next;
}edge1[500010];
node edge2[500010];
struct A
{
int f,g,v;
bool operator <(const A a)const
{
if(a.f==f)
return a.g<g;
return a.f<f;
}
};
int head1[1010];
int head2[1010];
bool vis[1010];
int dis[1010];
int tol;
int n,m,k;
void addEdge(int u,int v,int w)
{
edge1[tol].to=v;
edge1[tol].w=w;
edge1[tol].next=head1[u];
head1[u]=tol;
edge2[tol].to=u;
edge2[tol].w=w;
edge2[tol].next=head2[v];
head2[v]=tol;
tol++;
}
void init()
{
tol=0;
memset(head1,-1,sizeof(head1));
memset(head2,-1,sizeof(head2));
}
void spfa(int des)
{
memset(vis,false,sizeof(vis));
for(int i=1;i<=n;i++)
dis[i]=INF;
dis[des]=0;
queue<int>q;
vis[des]=true;
q.push(des);
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=false;
for(int i=head2[u];i!=-1;i=edge2[i].next)
{
int v=edge2[i].to;
if(dis[v]>dis[u]+edge2[i].w)
{
dis[v]=dis[u]+edge2[i].w;
if(!vis[v])
{
vis[v]=true;
q.push(v);
}
}
}
}
}
int Astar(int src,int des)
{
int cnt=0;
if(src==des)
k++;
if(dis[src]==INF)
return -1;
priority_queue<A>q;
A a;
a.v=src;
a.g=0;
a.f=dis[src];
q.push(a);
while(!q.empty())
{
A a=q.top();
q.pop();
if(a.v==des)
{
cnt++;
if(cnt==k)
{
return a.g;
}
}
for(int i=head1[a.v];i!=-1;i=edge1[i].next)
{
A t;
t.g=a.g+edge1[i].w;
t.v=edge1[i].to;
t.f=t.g+dis[t.v];
q.push(t);
}
}
return -1;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
init();
int u,v,w;
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&w);
addEdge(u,v,w);
}
int src,des;
scanf("%d%d%d",&src,&des,&k);
spfa(des);
cout<<Astar(src,des)<<endl;
}
return 0;
}