#include<stdio.h>
#include<vector>
#include<queue>
using namespace std;
#define lg 1021
#define pb push_back
int n, m, k, x, y, c, nr[lg], nr2[lg], nod, nxt, i, j, fiu, lst[lg][lg], q[lg], cnt[lg], vct[lg];
vector <int> v[lg];
bool fst[lg];
typedef pair<int, int> graf;
vector <graf> v2[lg];
struct data{
int v, i;
};
data vvs, mn;
void df(int nod){
fst[nod] = 1;
for (int i = 0; i < nr[nod]; i ++)
if (!fst[v[nod][i]])
df(v[nod][i]);
q[++q[0]] = nod;
}
class mmc{
public:
bool operator()(data jos, data sus){
return sus.v < jos.v;
}
};
int main()
{
freopen("pitici.in", "rt", stdin);
freopen("pitici.out", "wt", stdout);
scanf("%d%d%d", &n, &m, &k);
for (i = 1; i <= m; i ++){
scanf("%d%d%d", &x, &y, &c);
nr[x] ++;
v[x].pb(y);
nr2[y] ++;
v2[y].pb(graf(x, c));
}
/*
for (i = 1; i <= n; i ++){
for (j = 0; j < nr2[i]; j ++)
printf("%d %d ", v2[i][j].first, v2[i][j].second);
printf("\n");
}
*/
df(1);
int x1 = 1, x2 = n;
while (x1 < x2){
swap(q[x1], q[x2]);
x1 ++, x2 --;
}
lst[1][0] = 1;
for (i = 2; i <= n; i ++){
nod = q[i];
priority_queue< data, vector<data>, mmc> hp;
memset(cnt, 0, sizeof(cnt));
for (fiu = 0; fiu < nr2[nod]; fiu ++){
int nxt = v2[nod][fiu].first;
cnt[nxt] ++;
vvs.v = lst[nxt][1] + v2[nod][fiu].second, vvs.i = nxt;
hp.push(vvs);
vct[nxt] = v2[nod][fiu].second;
}
for (j = 1; !hp.empty() && j <= k; j ++){
mn = hp.top(), hp.pop();
/*
if (nod == 9){
printf("am scos %d %d\n", mn.v, mn.i);
}
*/
lst[nod][++lst[nod][0]] = mn.v;
cnt[mn.i] ++;
if (cnt[mn.i] <= lst[mn.i][0]){
vvs.v = lst[mn.i][cnt[mn.i]] + vct[mn.i], vvs.i = mn.i;
/*
if (nod == 9)
printf("%d %d\n", lst[mn.i][cnt[mn.i]], vct[mn.i]);
*/
hp.push(vvs);
}
}
}
/*
for (i = 1; i <= n; i ++){
nod = q[i];
printf("pentru nodul %d [lungime %d]:\t", nod, lst[nod][0]);
for (j = 1; j <= k; j ++)
printf("%d ", lst[nod][j]);
printf("\n");
}
*/
for (i = 1; i <= k; i ++)
printf("%d ", lst[n][i]);
printf("\n");
return 0;
}