#include<iostream>
#include<vector>
#include<queue>
using namespace std;
struct node{
int n;
int l;
int b;
int o;
bool operator<(const node&b) const
{return l>b.l;}
};
priority_queue<node>q;
vector<node>a[100100];
int v[100100],an[100100][4];
int n,m,kk;
int main(){
int i,j,k,p,h,gg=0,uu=0,t=0;
cin>>n>>m>>kk;
node x,y;
h=0;
for(i=1;i<=m;i++){
cin>>x.n>>y.n>>x.l;
y.l=x.l;
x.o=0; y.o=1;
a[x.n].push_back(y);
a[y.n].push_back(x);
}
for(i=1;i<=n;i++)
v[i]=-1;
x.n=1; x.b=0;
q.push(x);
while(!q.empty()){
x=q.top();
q.pop();
if(v[x.n]==-1){
v[x.n]=1;
if(x.n!=1){
h++;
if(x.l==0) uu++;
if(x.o==1){an[h][1]=x.b; an[h][2]=x.n;}
else if(x.o==0){an[h][1]=x.n; an[h][2]=x.b;}
an[h][3]=x.l;
}
for(i=0;i<a[x.n].size();i++){
y.n=a[x.n][i].n;
y.l=a[x.n][i].l;
y.b=x.n;
y.o=a[x.n][i].o;
q.push(y);
}
}
}
if(h==n-1)
while(uu>kk&&gg<=n-1){
gg++;
if(an[gg][3]==0)
for(i=0;i<a[an[gg][1]].size();i++)
if(a[an[gg][1]][i].l==1){
uu--;
an[gg][2]=a[an[gg][1]][i].n;
if(a[an[gg][1]][i].o==0)
swap(an[gg][1],an[gg][2]);
an[gg][3]=1;
break;
}
}
if(uu==kk&&h==n-1){
for(i=1;i<=n-1;i++)
cout<<an[i][1]<<" "<<an[i][2]<<" "<<an[i][3]<<endl;
}
else cout<<"no solution"<<endl;
}