#include <stdio.h>
#include <string.h>
#include <vector>
#include <set>
#include <utility>
#include <time.h>
using namespace std;
#define MAXN 1024
#define pb push_back
#define mp make_pair
int N, M, K, A[MAXN][MAXN], viz[MAXN], Ind[MAXN], cost[MAXN];
vector<int> G[MAXN];
vector<int> C[MAXN];
set< pair<int, int> > T;
void dfs(int x)
{
int i, c, v;
vector<int>::iterator it, it2;
set< pair<int, int> >::iterator itset;
for(it = G[x].begin(); it != G[x].end(); it++)
if(!viz[*it])
viz[*it] = 1, dfs(*it);
T.clear();
for(it = G[x].begin(), it2 = C[x].begin(); it != G[x].end(); it++, it2++)
{
v = *it, c = *it2, Ind[v] = 1, cost[v] = c;
T.insert( mp(c+A[v][1], v) );
}
for(i = 1; i <= K && T.size(); i++)
{
itset = T.begin();
v = itset->second, c = itset->first;
A[x][++A[x][0]] = c, T.erase( mp(c, v) );
if(Ind[v] < A[v][0])
{
Ind[v]++;
T.insert( mp(cost[v]+A[v][Ind[v]], v) );
}
}
if(A[x][0] == 0)
A[x][++A[x][0]] = 0;
}
void read_and_solve(void)
{
int i, x, y, c;
scanf("%d %d %d\n", &N, &M, &K);
for(i = 1; i <= M; i++)
{
scanf("%d %d %d\n", &x, &y, &c);
G[y].pb(x), C[y].pb(c);
}
viz[N] = 1, dfs(N);
for(i = 1; i < K; i++)
printf("%d ", A[N][i]);
printf("%d\n", A[N][K]);
}
int main(void)
{
freopen("pitici.in", "rt", stdin);
freopen("pitici.out", "wt", stdout);
int start, end;
start = clock();
read_and_solve();
end = clock();
fprintf(stderr, "%lf\n", (double)(end-start)/CLK_TCK);
return 0;
}