#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <unordered_map>
#include <set>
#include <array>
using namespace std;
#define SZ(a) (int)(a).size()
typedef long long ll;
const auto lim = (int)1e5;
int main() {
cin.sync_with_stdio(false);
int n, m, nc;
cin >> n >> m >> nc;
vector<unordered_map<int, int>> al(n);
for (auto i = 0; i < m; i++) {
int u, v, c;
cin >> u >> v >> c;
u--; v--;
al[u].emplace(v, c);
al[v].emplace(u, c);
}
set<pair<int, int>> degs;
for (auto u = 0; u < n; u++) {
degs.emplace(SZ(al[u]), u);
}
auto ntri = 0;
set<array<int, 3>> tris;
for (auto i = 0; i < n; i++) {
auto it = begin(degs);
auto u = it->second;
degs.erase(it);
for (auto pv: al[u]) {
auto v = pv.first;
auto cuv = pv.second;
for (auto pw: al[u]) {
auto w = pw.first;
if (v == w) {
break;
}
auto cuw = pw.second;
if (cuv == cuw) {
continue;
}
auto it = al[v].find(w);
if (it == end(al[v])) {
continue;
}
auto cvw = it->second;
if (cuv == cvw || cuw == cvw) {
continue;
}
ntri++;
if (ntri <= lim) {
array<int, 3> tri = {u, v, w};
sort(begin(tri), end(tri));
tris.insert(tri);
}
}
}
for (auto pv: al[u]) {
auto v = pv.first;
degs.erase({SZ(al[v]), v});
al[v].erase(u);
degs.emplace(SZ(al[v]), v);
}
}
printf("%d\n", ntri);
if (ntri <= lim) {
for (auto tri: tris) {
for (auto i = 0; i < 3; i++) {
printf("%d%c", tri[i]+1, " \n"[i == 2]);
}
}
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KI2luY2x1ZGUgPHNldD4KI2luY2x1ZGUgPGFycmF5Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIFNaKGEpIChpbnQpKGEpLnNpemUoKQp0eXBlZGVmIGxvbmcgbG9uZyBsbDsKIApjb25zdCBhdXRvIGxpbSA9IChpbnQpMWU1OwogCmludCBtYWluKCkgewoJY2luLnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CglpbnQgbiwgbSwgbmM7CgljaW4gPj4gbiA+PiBtID4+IG5jOwoJdmVjdG9yPHVub3JkZXJlZF9tYXA8aW50LCBpbnQ+PiBhbChuKTsKCWZvciAoYXV0byBpID0gMDsgaSA8IG07IGkrKykgewoJCWludCB1LCB2LCBjOwoJCWNpbiA+PiB1ID4+IHYgPj4gYzsKCQl1LS07IHYtLTsKCQlhbFt1XS5lbXBsYWNlKHYsIGMpOwoJCWFsW3ZdLmVtcGxhY2UodSwgYyk7Cgl9CglzZXQ8cGFpcjxpbnQsIGludD4+IGRlZ3M7Cglmb3IgKGF1dG8gdSA9IDA7IHUgPCBuOyB1KyspIHsKCQlkZWdzLmVtcGxhY2UoU1ooYWxbdV0pLCB1KTsKCX0KCWF1dG8gbnRyaSA9IDA7CglzZXQ8YXJyYXk8aW50LCAzPj4gdHJpczsKCWZvciAoYXV0byBpID0gMDsgaSA8IG47IGkrKykgewoJCWF1dG8gaXQgPSBiZWdpbihkZWdzKTsKCQlhdXRvIHUgPSBpdC0+c2Vjb25kOwoJCWRlZ3MuZXJhc2UoaXQpOwoJCWZvciAoYXV0byBwdjogYWxbdV0pIHsKCQkJYXV0byB2ID0gcHYuZmlyc3Q7CgkJCWF1dG8gY3V2ID0gcHYuc2Vjb25kOwoJCQlmb3IgKGF1dG8gcHc6IGFsW3VdKSB7CgkJCQlhdXRvIHcgPSBwdy5maXJzdDsKCQkJCWlmICh2ID09IHcpIHsKCQkJCQlicmVhazsKCQkJCX0KCQkJCWF1dG8gY3V3ID0gcHcuc2Vjb25kOwoJCQkJaWYgKGN1diA9PSBjdXcpIHsKCQkJCQljb250aW51ZTsKCQkJCX0KCQkJCWF1dG8gaXQgPSBhbFt2XS5maW5kKHcpOwoJCQkJaWYgKGl0ID09IGVuZChhbFt2XSkpIHsKCQkJCQljb250aW51ZTsKCQkJCX0KCQkJCWF1dG8gY3Z3ID0gaXQtPnNlY29uZDsKCQkJCWlmIChjdXYgPT0gY3Z3IHx8IGN1dyA9PSBjdncpIHsKCQkJCQljb250aW51ZTsKCQkJCX0KCQkJCW50cmkrKzsKCQkJCWlmIChudHJpIDw9IGxpbSkgewoJCQkJCWFycmF5PGludCwgMz4gdHJpID0ge3UsIHYsIHd9OwoJCQkJCXNvcnQoYmVnaW4odHJpKSwgZW5kKHRyaSkpOwoJCQkJCXRyaXMuaW5zZXJ0KHRyaSk7CgkJCQl9CgkJCX0KCQl9CgkJZm9yIChhdXRvIHB2OiBhbFt1XSkgewoJCQlhdXRvIHYgPSBwdi5maXJzdDsKCQkJZGVncy5lcmFzZSh7U1ooYWxbdl0pLCB2fSk7CgkJCWFsW3ZdLmVyYXNlKHUpOwoJCQlkZWdzLmVtcGxhY2UoU1ooYWxbdl0pLCB2KTsKCQl9Cgl9CglwcmludGYoIiVkXG4iLCBudHJpKTsKCWlmIChudHJpIDw9IGxpbSkgewoJCWZvciAoYXV0byB0cmk6IHRyaXMpIHsKCQkJZm9yIChhdXRvIGkgPSAwOyBpIDwgMzsgaSsrKSB7CgkJCQlwcmludGYoIiVkJWMiLCB0cmlbaV0rMSwgIiBcbiJbaSA9PSAyXSk7CgkJCX0KCQl9Cgl9CglyZXR1cm4gMDsKfQog