# include <stdio.h>
# include <string.h>
# define _fin "pitici.in"
# define _fout "pitici.out"
# define maxn 1020
# define maxm 200020
int *c[maxn], *v[maxn], bx[maxm], by[maxm], cnt[maxn],
bc[maxm],
b[maxn][maxn],
n, m, k, i, j, node;
char row[64];
int getnum(int &poz)
{
int ret=0;
while ( row[poz]<=0x39 && row[poz]>=0x30 )
ret = ret * 10 + row[poz]-0x30, ++poz;
++poz;
return ret;
}
void readf()
{
//freopen(_fin, "r", stdin);
FILE *fin = fopen(_fin, "r");
int aux=0;
for (fscanf(fin, "%d%d%d\n", &n, &m, &k), i=1; i<=m; i++)
{
fgets(row, 64, fin);
aux=0;
bx[i] = getnum(aux), by[i] = getnum(aux), bc[i] = getnum(aux);
++cnt[bx[i]];
}
for (i=1; i<=n; i++)
v[i] = new int[ cnt[i]+1 ], v[i][0]=0,
c[i] = new int[ cnt[i]+1 ];
for (i=1; i<=m; i++)
v[bx[i]][++v[bx[i]][0]] = by[i],
c[bx[i]][ v[bx[i]][0] ] = bc[i];
}
int viz[maxn], ord[maxn];
void df(int node)
{
int i; viz[node]=1;
for (i=1; i<=v[node][0]; i++)
if ( !viz[ v[node][i] ] ) df( v[node][i] );
ord[++ord[0]] = node;
}
int a[maxn], C[maxn];
void solve()
{
df(1), b[1][0]=1, b[1][1]=0;
int ii, sum, to;
int I, J, K;
for (ii=n; ii>=2; ii--)
for (node=ord[ii], i=1; i<=v[node][0]; i++)
{
to = v[node][i];
for (I=1, J=1, K=1; (I<=b[node][0] || J<=b[to][0]) && K<=k; K++)
if ( J>b[to][0] || (I<=b[node][0] && b[node][I]+c[node][i] < b[to][J] ) )
C[ K ] = b[node][I++] + c[node][i];
else
C[ K ] = b[to][J++];
/* for (a[0]=0, j=1; j<=b[node][0]; j++)
a[ ++a[0] ] = b[node][j] + c[node][i];
// interclaseaza vectorul a cu vectorul b[to]
for (I=1, J=1, K=1; (I<=a[0] || J<=b[to][0]) && K<=k; )
if ( J>b[to][0] || (I<=a[0] && a[I] < b[to][J]) )
C[ K++ ] = a[I++];
else
C[ K++ ] = b[to][J++];*/
memcpy(b[to], C, sizeof(int)*K);
b[to][0] = K-1;
}
}
void writef()
{
freopen(_fout,"w", stdout);
for (i=1; i<k; i++) printf("%d ", b[n][i]); printf("%d\n", b[n][i]);
}
int main()
{
readf();
solve();
writef();
return 0;
}