#include <bits/stdc++.h>
using namespace std;
int n, m, k;
int fa[20010];
//先跑水泥路(1)
struct node {
int x, y;
bool rd;
};
bool cmp(node a, node b) {
return a.rd > b.rd;
}
bool pmc(node a, node b) {
return a.rd < b.rd;
}
int find(int x) {
if (fa[x] == x) {
return x;
}
return fa[x] = find(fa[x]);
}
void add(int x, int y) {
x = find(x), y = find(y);
if (x != y) {
fa[x] = y;
}
}
vector<node> edges;
vector<node> ans;
int main() {
cin >> n >> m >> k;
int cnt = 0;
//输入
for (int i = 1; i <= m; i++) {
int u, v;
bool c;
cin >> u >> v >> c;
if (!c) {
cnt++;
}
edges.push_back({u, v, c});
}
if (cnt < k) {
cout << "no solution";
return 0;
}
//跑水泥路
for (int i = 1; i <= n; i++) {
fa[i] = i;
}
sort(edges.begin(), edges.end(), cmp);
int i = 0;
for (i = 0; i < edges.size(); i++) {
if (!edges[i].rd) {
break;
}
if (find(edges[i].x) != find(edges[i].y)) {
add(edges[i].x, edges[i].y);
}
}
cnt = 0;
for (; i < edges.size(); i++) {
if (find(edges[i].x) != find(edges[i].y)) {
add(edges[i].x, edges[i].y);
cnt++;
ans.push_back({ edges[i].x, edges[i].y, edges[i].rd });
edges.erase(edges.begin() + i);
i--;
}
}
if (cnt > k) {
cout << "no solution";
return 0;
}
//查联通
for (i = 1; i < n; i++) {
for (int j = i + 1; j <= n; j++) {
if (find(i) != find(j)) {
cout << "no solution";
return 0;
}
}
}
for (int i = 1; i <= n; i++) {
fa[i] = i;
}
for (auto x : ans) {
add(x.x, x.y);
}
//加其他鹅卵石路
sort(edges.begin(), edges.end(), pmc);
i = 0;
while (cnt < k) {
if (find(edges[i].x) != find(edges[i].y)) {
add(edges[i].x, edges[i].y);
cnt++;
ans.push_back({ edges[i].x, edges[i].y, edges[i].rd });
}
i++;
}
for (i = 0; i < edges.size(); i++) {
if (edges[i].rd) {
break;
}
}
if (ans.size() != k) {
cout << "no solution";
return 0;
}
//加水泥路
for (; i < edges.size(); i++) {
if (find(edges[i].x) != find(edges[i].y)) {
add(edges[i].x, edges[i].y);
cnt++;
ans.push_back({ edges[i].x, edges[i].y, edges[i].rd });
}
}
//输出
for (auto x : ans) {
cout << x.x << " " << x.y << " " << x.rd << endl;
}
return 0;
}
86/72pts的原因是你古的评测机