#include <bits/stdc++.h>
using namespace std;
const int N=500005;
int dis[N],backup[N];
long long ans=0;
int n,m,k;
struct stu{
int a,b,v;
}s[N];
int pollman(){
memset(dis,0x3f3f3f,sizeof dis);
dis[1]=0;
for(int i=1;i<=k;i++){
memcpy(backup,dis,sizeof dis);
for(int j=1;j<=m;j++){
int a=s[j].a,b=s[j].b,v=s[j].v;
dis[b]=min(dis[b],v+backup[a]);
}
}
if(dis[n]>0x3f3f3f/2)
return -1;
else
return dis[n];
}
int main() {
cin>>n>>m>>k;
for(int i=1;i<=m;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
s[i]={a,b,c};
}
int t=pollman();
if(t==-1)
cout<<"impossible";
else
cout<<t;
}
#include <bits/stdc++.h>
using namespace std;
const int N=5000005;
int ne[N],e[N],idx,h[N],u[N];
int n,m,dis[N];
bool f[N];
void add(int a,int b,int c){
e[idx]=b,u[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
int spfa(){
memset(dis,0x3f3f3f,sizeof dis);
queue<int> q;
q.push(1);
dis[1]=0;
f[1]=true;
while(q.size()){
int t=q.front();
q.pop();
f[t]=false;
for(int i=h[t];i!=-1;i=ne[i]){
int j=e[i];
if(dis[j]>dis[t]+u[i]){
dis[j]=dis[t]+u[i];
if(!f[j]){
f[j]=true;
q.push(j);
}
}
}
}
return dis[n];
}
int main(){
memset(h,-1,sizeof h);
cin>>n>>m;
for(int i=0;i<m;i++){
int a,b,c;
cin>>a>>b>>c;
add(a,b,c);
add(b,a,c);
}
int t=spfa();
cout<<t;
}