#include <bits/stdc++.h>
using namespace std;
#define MAX_N 100001
#define MAX_M 500001
int n, m, k;
struct Edge
{
int u, v, w;
};
Edge e[MAX_M];
int cnt;
void AddEdge( int u, int v, int w )
{
e[cnt].u = u;
e[cnt].v = v;
e[cnt++].w = w;
}
int fa[MAX_N];
void Init( )
{
int i;
for(i=0;i<=n;++i)
fa[i] = -1;
return ;
}
int Find( int x )
{
return fa[x] < 0 ? x : fa[x] = Find( fa[x] );
}
void Union( int u, int v )
{
if(fa[u] > fa[v])
{
fa[v] += fa[u];
fa[u] = v;
}
else
{
fa[u] += fa[v];
fa[v] = u;
}
}
bool Cmp( const Edge &a, const Edge &b )
{
return a.w < b.w;
}
long long edge_cnt;
int ind[MAX_M];
long long r_cnt;
void Kruskal()
{
Init();
sort( e, e+cnt, Cmp );
bool flag = false;
int i;
int u, v;
for(i=0;i<cnt;++i)
{
u = Find(e[i].u);
v = Find(e[i].v);
if(u == v)
continue;
if(flag == true && e[i].w == 0)
continue;
Union( u, v );
if(e[i].w == 0)
++r_cnt;
if(r_cnt == k)
flag = true;
ind[edge_cnt] = i;
++edge_cnt;
if(edge_cnt == n-1)
break;
}
return ;
}
int main( void )
{
ios::sync_with_stdio(false);
cin.tie(0);
int i;
int u, v, w;
cin>>n>>m>>k;
for(i=1;i<=m;++i)
{
cin>>u>>v>>w;
AddEdge( u, v, w );
}
Kruskal();
if(edge_cnt < n-1 || r_cnt < k)
{
cout<<"no solution"<<endl;
return 0;
}
for(i=0;i<edge_cnt;++i)
cout<<e[ind[i]].u<<' '<<e[ind[i]].v<<' '<<e[ind[i]].w<<endl;
return 0;
}
第五点WA,求助!