#include<iostream>
#include<vector>
#include<queue>
#define int long long
using namespace std;
const int N=5005;
int n,r,u,v,w,k;
#define pii pair<int,int>
#define inf 2147483647
int dis[N],dis2[N];
struct Edge{
int to,value;
};
vector<Edge>G[N];
priority_queue<pii,vector<pii>,greater<pii> >Q;
bool flag;
int num[N],cnt;
int pa[N];
signed main(){
cin.tie(0)->sync_with_stdio(0);
cin>>n>>r>>k;
while(r--){
cin>>u>>v>>w;
G[u].push_back({v,w});
G[v].push_back({u,w});
}
for(int i=2;i<=n;i++){
dis[i]=dis2[i]=inf;
}
dis2[1]=inf;
Q.push({dis[1],1});
while(!Q.empty()){
int u=Q.top().second;
Q.pop();
for(int i=0;i<G[u].size();i++){
int son=G[u][i].to;
if(pa[son]<k&&son!=n&&son!=1){
continue;
}
int cost=G[u][i].value;
flag=0;
if(dis[son]>dis[u]+cost){
dis2[son]=min(dis2[son],dis[son]);
dis[son]=dis[u]+cost;
flag=1;
}
else if(dis2[son]>dis[u]+cost&&dis[u]+cost!=dis[son]){
dis2[son]=dis[u]+cost;
flag=1;
}
else if(dis2[son]>dis2[u]+cost){
dis2[son]=dis2[u]+cost;
flag=1;
}
if(flag){
Q.push({dis[son],son});
}
}
}
if(dis2[n]==inf){
cout<<"-1";
}
else{
cout<<dis2[n];
}
return 0;
}