不要压行!不然就会像愚蠢的我一样 58 分!全世界只有我会犯这种错误了。。。
//58pts
#include <bits/stdc++.h>
using namespace std;
int fa[20010],n,m,k,cnt=0,cnt1=0,cur=0;
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
void merge(int x,int y){fa[find(x)]=find(y);}
struct node{
int u,v,w;bool f=0,ok=0;
}e[100010];
bool cmp(node a,node b){return a.w<b.w;}
int main(){
cin>>n>>m>>k;
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++){
int x,y,z;++cur;
cin>>x>>y>>z;
e[cur].u=x;e[cur].v=y;e[cur].w=1-z;
}
sort(e+1,e+m+1,cmp);
for(int i=1;i<=m;i++){
if(find(fa[e[i].u])!=find(fa[e[i].v])&&cnt<n-1){
cnt++;
merge(e[i].u,e[i].v);
if(e[i].w==1){
e[i].f=1;
cnt1++;
e[i].ok=1;
}
}
}
if(m<k||cnt1>k){cout<<"no solution"<<endl;return 0;}
for(int i=1;i<=n;i++) fa[i]=i;
int val=0;
for(int i=1;i<=m&&e[i].f==1;i++){merge(e[i].u,e[i].v);val++;}
for(int i=1;i<=m&&e[i].f==0;i++){
if(find(fa[e[i].u])!=find(fa[e[i].v])&&cnt1<k&&e[i].w==1){
merge(e[i].u,e[i].v);
++cnt1;
e[i].ok=1;
val++;
}
}
if(cnt1!=k){cout<<"no solution"<<endl;return 0;}
cnt=k;
for(int i=1;i<=m&&e[i].w==0;i++){
if(find(fa[e[i].u])!=find(fa[e[i].v])&&cnt<n-1){
cnt++;
merge(e[i].u,e[i].v);
e[i].ok=1;
}
}
for(int i=1;i<=m;i++) if(e[i].ok==1) cout<<e[i].u<<" "<<e[i].v<<" "<<1-e[i].w<<endl;
return 0;
}
//AC
#include <bits/stdc++.h>
using namespace std;
int fa[20010],n,m,k,cnt=0,cnt1=0,cur=0;
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
void merge(int x,int y){fa[find(x)]=find(y);}
struct node{
int u,v,w;bool f=0,ok=0;
}e[100010];
bool cmp(node a,node b){return a.w<b.w;}
int main(){
cin>>n>>m>>k;
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++){
int x,y,z;++cur;
cin>>x>>y>>z;
e[cur].u=x;e[cur].v=y;e[cur].w=1-z;
}
sort(e+1,e+m+1,cmp);
for(int i=1;i<=m;i++){
if(find(fa[e[i].u])!=find(fa[e[i].v])&&cnt<n-1){
cnt++;
merge(e[i].u,e[i].v);
if(e[i].w==1){
e[i].f=1;
cnt1++;
e[i].ok=1;
}
}
}
if(m<k||cnt1>k){cout<<"no solution"<<endl;return 0;}
for(int i=1;i<=n;i++) fa[i]=i;
int val=0;
for(int i=1;i<=m;i++) if(e[i].f==1){merge(e[i].u,e[i].v);val++;}
for(int i=1;i<=m;i++){
if(e[i].f==0&&find(fa[e[i].u])!=find(fa[e[i].v])&&cnt1<k&&e[i].w==1){
merge(e[i].u,e[i].v);
++cnt1;
e[i].ok=1;
val++;
}
}
if(cnt1!=k){cout<<"no solution"<<endl;return 0;}
cnt=k;
for(int i=1;i<=m;i++){
if(e[i].w==0&&find(fa[e[i].u])!=find(fa[e[i].v])&&cnt<n-1){
cnt++;
merge(e[i].u,e[i].v);
e[i].ok=1;
}
}
for(int i=1;i<=m;i++) if(e[i].ok==1) cout<<e[i].u<<" "<<e[i].v<<" "<<1-e[i].w<<endl;
return 0;
}