#include<bits/stdc++.h>
using namespace std;
priority_queue<pair<int> > q;
struct student
{
int to,next,v;
}e[9999999];
int dis[9999999],vis[9999999],head[9999999];
int main()
{
int n,m,k,i,j,u,v,w,ans,t=0,x;
cin>>n>>m>>k;
dis[1]=0;
for(i=2;i<=n;i++)
{
dis[i]=0x3f3f3f3f;
}
memset(vis,0,sizeof(vis));
for(i=1;i<=m;i++)
{
cin>>u>>v>>w;
t++;
e[t].to=v;
e[t].next=head[u];
e[t].v=w;
head[u]=t;
t++;
e[t].to=u;
e[t].next=head[v];
e[t].v=w;
head[v]=t;
for(j=1;j<=k;j++)
{
t++;
e[t].to=j*n+v;
e[t].next=head[j*n+u];
e[t].v=t;
head[j*n+u]=t;
t++;
e[t].to=j*n+u;
e[t].next=head[j*n+v];
e[t].v=t;
head[j*n+v]=t;
t++;
e[t].to=j*n+v;
e[t].next=head[(j-1)*n+u];
e[t].v=0;
head[(j-1)*n+u]=t;
t++;
e[t].to=j*n+u;
e[t].next=head[(j-1)*n+v];
e[t].v=0;
head[(j-1)*n+v]=t;
}
}
q.push(make_pair(0,1));
while(q.size()!=0)
{
x=q.top().second;
q.pop();
if(vis[x]==0)
{
vis[x]=1;
for(i=head[x];i!=0;i=e[i].next)
{
if(dis[e[i].to]>dis[x]+e[i].v)
{
dis[e[i].to]=dis[x]+e[i].v;
q.push(make_pair(-dis[e[i].to],e[i].to));
}
}
}
}
ans=dis[n];
for(i=1;i<=k;i++)
{
ans=min(ans,dis[(i+1)*n]);
}
cout<<ans;
return 0;
}