#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 510, M = 10010;
// 邻接表存储方式2(n, m)
int n, m, k;
struct Edge
{
int a, b, c;
}edges[M];
int dist[N];
int last[N];
void bellman_ford()
{
// Bellman_Ford算法最短路:源,距,更新
int goal = 1;
// int dist[N];
memset(dist, 0x3f, sizeof dist);
dist[1] = 0;
for (int i = 0; i < k; i ++ )
{
// Bellman_Ford:严格控制迭代轮数
memcpy(last, dist, sizeof dist);
for (int j = 0; j < m; j ++ )
{
// Bellman_Ford更新公式:类似于宽搜策略
// 松弛搜索:a->b, b->c, 第一轮(a只能到b, b->c不更新), 第二轮(a->c的路径自动更新)
auto e = edges[j];
dist[e.b] = min(dist[e.b], last[e.a] + e.c);
}
}
}
int main()
{
scanf("%d%d%d", &n, &m, &k);
for (int i = 0; i < m; i ++ )
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
edges[i] = {a, b, c};
}
bellman_ford();
if (dist[n] > 0x3f3f3f3f / 2) puts("impossible");
else printf("%d\n", dist[n]);
return 0;
}