#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=510, M=10010;
int n,m,k;
int dist[N],backup[N];
struct edge
{
int a,b,w;
}edges[M];
int bellman_ford()
{
memset(dist, 0x3f, sizeof dist);
dist[1]=0;
for(int i=0;i<k;i++)
{
memcpy(backup, dist, sizeof dist);//这里要做的是将dist的值做备份,所以用memcpy将值拷贝到backup中
for(int j=0;j<m;j++)//这里循环的是所有的边m
{
int a=edges[j].a, b=edges[j].b, w=edges[j].w;
dist[b]=min(dist[b], backup[a]+w);//易错点①:这里一定是用节点的上一轮备份来进行更新,否则无法满足k的限制
}
}
if(dist[n] > 0x3f3f3f3f / 2 ) return -1;
return dist[n];
}
int main()
{
cin>>n>>m>>k;
for(int i=0;i<m;i++)
{
int a,b,w;
cin>>a>>b>>w;
edges[i]={a,b,w};
}
int t=bellman_ford();
if(t==-1) cout<<"impossible"<<endl;
else cout<<t<<endl;
return 0;
}