using namespace std;
#include <set>
#include <map>
#include <list>
#include <deque>
#include <stack>
#include <queue>
#include <cmath>
#include <cstdio>
#include <vector>
#include <string>
#include <bitset>
#include <utility>
#include <algorithm>
#define pb push_back
#define sz size
#define f first
#define s second
#define II inline
#define ll long long
#define db double
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define all(v) v.begin() , v.end()
#define CC(v) memset((v),0,sizeof((v)))
#define CP(v,w) memcpy((v),(w),sizeof((w)))
#define mp make_pair
#define IN "pitici.in"
#define OUT "pitici.out"
#define N_MAX 1<<10
#define oo 1684300900
typedef vector<int> VI;
typedef pair<int,int> pi;
typedef vector<string> VS;
int N,M,K;
vector< vector<pi> > A(N_MAX),B(N_MAX);
int S[N_MAX],G[N_MAX],C[N_MAX][N_MAX];
vector<bool> viz(N_MAX);
priority_queue<pi,vector<pi>,greater< pi > > Q;
II void scan()
{
freopen(IN,"r",stdin);
freopen(OUT,"w",stdout);
scanf("%d%d%d\n",&N,&M,&K);
int x,y,c;
FOR(i,1,M)
{
scanf("%d%d%d\n",&x,&y,&c);
A[x].pb( mp(y,c) );
B[y].pb( mp(x,c) );
++G[y];
}
}
II void solve()
{
FOR(i,1,N)
if(!G[i])
S[++S[0]] = i;
FOR(i,1,N)
{
int nod = S[i];
FOR(j,0,(int)A[nod].sz()-1)
{
--G[ A[nod][j].f ];
if(!G[ A[nod][j].f ])
S[++S[0]] = A[nod][j].f;
}
}
memset(C,100,sizeof(C));
C[1][1] = 0;
FOR(i,1,N)
{
int nod = S[i];
CC(G);
FOR(j,0,(int)B[nod].sz()-1)
Q.push( mp(C[ B[nod][j].f ][1] + B[nod][j].s,j) );
if(Q.empty() )
continue;
FOR(k,1,K)
{
C[nod][k] = Q.top().f;
int tata = B[nod][ Q.top().s ].f;
Q.push( mp(C[tata][++G[tata]+1] + B[nod][ Q.top().s ].s,Q.top().s) );
Q.pop();
}
for(;!Q.empty();Q.pop());
}
FOR(k,1,K)
printf("%d ",C[N][k]);
}
int main()
{
scan();
solve();
return 0;
}