#include <cstdio>
#include <vector>
#include <set>
#define maxn 1050
#define inf 2000000000
using namespace std;
int n, m, i, j, k, a, b, c;
vector <int> v[maxn], cs[maxn];
int cd[maxn], nrin[maxn], nr[maxn];
multiset <int> h[maxn];
multiset <int>::iterator it;
int nrt[maxn];
void insert(int nod, int cost) {
multiset <int>::iterator it2;
int ct = 0;
if (h[nod].size()) {
it2 = h[nod].end();
--it2;
ct = (*it2);
}
// fprintf(stderr, "%d %d %d\n", nod, cost, nrt[nod]);
if (nrt[nod] == k && cost >= ct)
return;
// fprintf(stderr, "%d %d\n", nod, nrt[nod]);
//tre sa il bag
if (nrt[nod] < k) {
h[nod].insert(cost);
nrt[nod]++;
}
else {
// fprintf(stderr, "%d %d\n", nod, *it);
h[nod].erase(ct);
h[nod].insert(cost);
}
}
void bf(int nd) {
int nod, fiu, i, j, p, u;
p = u = 1;
cd[1] = nd;
h[1].insert(0);
while (p <= u) {
nod = cd[p];
for (i = 0; i < v[nod].size(); i++) {
fiu = v[nod][i];
nr[fiu]++; //in asta tin cat intra in el
// fprintf(stderr, "%d %d\n", nod, fiu);
for (it = h[nod].begin(); it != h[nod].end(); ++it) {//drumurile de pana acum
insert(fiu, (*it) + cs[nod][i]);
// fprintf(stderr, "%d %d %d\n", nod, fiu, (*it) + cs[nod][i]);
}
if (nr[fiu] == nrin[fiu]) {
u++;
cd[u] = fiu;
}
}
p++;
}
}
int main() {
freopen("pitici.in", "r", stdin);
freopen("pitici.out", "w", stdout);
scanf("%d%d%d", &n, &m, &k);
for (i = 1; i <= m; i++) {
scanf("%d%d%d", &a, &b, &c);
nrin[b]++;
v[a].push_back(b);
cs[a].push_back(c);
}
bf(1);
it = h[n].begin();
for (i = 1; i <= k; i++) {
printf("%d ", *it);
++it;
}
return 0;
}