#include<iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;
int n,m,kk,ans[100100][4],u[100100],ii;
struct node{
int x,y,z;
}a[100100];
bool cmp(node a,node b){
return a.z>b.z;
}
bool cmop(node a,node b){
return a.z<b.z;
}
void ufs(int x,int y){
while(u[x]!=0) x=u[x];
while(u[y]!=0) y=u[y];
if(x!=y) {
u[y]=x;
ii=1;
}
}
int main(){
int i,j,k=0,p=0,an=0,gg;
scanf("%d%d%d",&n,&m,&kk);
gg=m;
for(i=1;i<=m;i++)
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
sort(a+1,a+m+1,cmp);
for(i=1;i<=m;i++){
ii=0;
ufs(a[i].x,a[i].y);
if(ii==1){
p++;
if(a[i].z==0){
an++;
ans[an][1]=a[i].x;
ans[an][2]=a[i].y;
ans[an][3]=a[i].z;
}
if(p==n-1) break;
}
}
if(an>kk||p<n-1){
cout<<"no solution"<<endl; return 0;
}
for(i=1;i<=n;i++) u[i]=0;
for(i=1;i<=an;i++){
ufs(ans[i][1],ans[i][2]);
}
p=an;
k=0;
int o=an;
sort(a+1,a+1+m,cmop);
for(i=1;i<=m;i++){
ii=0;
if(o<kk||a[i].z==1) {
ufs(a[i].x,a[i].y);
if(ii==1){
p++;
if(a[i].z==0) o++;
an++;
ans[an][1]=a[i].x;
ans[an][2]=a[i].y;
ans[an][3]=a[i].z;
if(p==n-1) break;
}
}
}
if(o<kk||p<n-1) cout<<"no solution"<<endl;
else for(i=1;i<=n-1;i++)
printf("%d %d %d\n",ans[i][1],ans[i][2],ans[i][3]);
}