#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define fbo find_by_order
#define ook order_of_key
typedef long long ll;
typedef pair<int,int> ii;
typedef vector<int> vi;
typedef long double ld;
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> pbds;
typedef set<int>::iterator sit;
typedef map<int,int>::iterator mit;
typedef vector<int>::iterator vit;
vector<pair<ii,int> > edges;
vector<ii> adj[100001];
int C;
set<pair<ii,int> > s;
const int MX = 100000;
ll hsh(int a, int b)
{
return (ll(a)*1000001LL + ll(b));
}
unordered_map<ll,int> ma;
void ins(int a, int b, int c)
{
if(s.size() > MX) return ;
//int x[3];
//x[0]=a; x[1]=b; x[2]=c;
//sort(x,x+3);
//s.insert(mp(mp(x[0],x[1]),x[2]));
if(a>b) swap(a,b);
if(a>c) swap(a,c);
if(b>c) swap(b,c);
s.insert(mp(mp(a,b),c));
}
int n, m;
bool heavy(int u)
{
if(adj[u].size() >= C) return true;
return false;
}
ll ansheavy;
ll anslight;
void processheavy(int x)
{
for(int i = 0; i < m; i++)
{
int heavycnt = 1;
int u = edges[i].fi.fi; int v = edges[i].fi.se; int c = edges[i].se;
if(u==x||v==x) continue;
if(heavy(u)) heavycnt++;
if(heavy(v)) heavycnt++;
int c1 = ma[hsh(u,x)];
int c2 = ma[hsh(v,x)];
if(c1==0||c2==0) continue;
if(c!=c1&&c1!=c2&&c!=c2)
{
ins(x,u,v);
if(heavycnt==3)
{
ansheavy+=2;
}
else if(heavycnt==2)
{
ansheavy+=3;
}
else
{
ansheavy+=6;
}
}
}
}
void processlight(int u, int v, int c)
{
for(int i = 0; i < adj[u].size(); i++)
{
int w = adj[u][i].fi; int c1 = adj[u][i].se;
if(heavy(w)) continue;
int c2 = ma[hsh(v,w)];
if(c2==0) continue;
if(c1!=c2&&c2!=c&&c!=c1)
{
anslight++;
ins(u,v,w);
}
}
}
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0);
int k;
cin>>n>>m>>k;
C = 450;
for(int i = 0; i < m; i++)
{
int u, v, c;
cin>>u>>v>>c;
u--; v--;
ma[hsh(u,v)] = c;
ma[hsh(v,u)] = c;
adj[u].pb(mp(v,c));
adj[v].pb(mp(u,c));
edges.pb(mp(mp(u,v),c));
}
for(int i = 0; i < n; i++)
{
if(heavy(i))
{
processheavy(i);
}
}
for(int i = 0; i < m; i++)
{
int u = edges[i].fi.fi; int v = edges[i].fi.se; int c = edges[i].se;
if(heavy(u)||heavy(v)) continue;
processlight(u,v,c);
}
ansheavy/=6;
anslight/=3;
ll ans = ansheavy + anslight;
cout<<ans<<'\n';
if(ans <= MX)
{
for(set<pair<ii,int> >::iterator it = s.begin(); it != s.end(); it++)
{
cout << (*it).fi.fi+1 << ' ' << (*it).fi.se + 1 << ' ' << (*it).se + 1 << '\n';
}
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDxleHQvcGJfZHMvYXNzb2NfY29udGFpbmVyLmhwcD4KI2luY2x1ZGUgPGV4dC9wYl9kcy90cmVlX3BvbGljeS5ocHA+CiAKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdXNpbmcgbmFtZXNwYWNlIF9fZ251X3BiZHM7CiAKI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlIHNlY29uZAojZGVmaW5lIG1wIG1ha2VfcGFpcgojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIGZibyBmaW5kX2J5X29yZGVyCiNkZWZpbmUgb29rIG9yZGVyX29mX2tleQogCnR5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIHBhaXI8aW50LGludD4gaWk7CnR5cGVkZWYgdmVjdG9yPGludD4gdmk7CnR5cGVkZWYgbG9uZyBkb3VibGUgbGQ7IAp0eXBlZGVmIHRyZWU8aW50LCBudWxsX3R5cGUsIGxlc3M8aW50PiwgcmJfdHJlZV90YWcsIHRyZWVfb3JkZXJfc3RhdGlzdGljc19ub2RlX3VwZGF0ZT4gcGJkczsKdHlwZWRlZiBzZXQ8aW50Pjo6aXRlcmF0b3Igc2l0Owp0eXBlZGVmIG1hcDxpbnQsaW50Pjo6aXRlcmF0b3IgbWl0Owp0eXBlZGVmIHZlY3RvcjxpbnQ+OjppdGVyYXRvciB2aXQ7CiAKdmVjdG9yPHBhaXI8aWksaW50PiA+IGVkZ2VzOwp2ZWN0b3I8aWk+IGFkalsxMDAwMDFdOwppbnQgQzsKc2V0PHBhaXI8aWksaW50PiA+IHM7CmNvbnN0IGludCBNWCA9IDEwMDAwMDsKIApsbCBoc2goaW50IGEsIGludCBiKQp7CQoJcmV0dXJuIChsbChhKSoxMDAwMDAxTEwgKyBsbChiKSk7Cn0KIAp1bm9yZGVyZWRfbWFwPGxsLGludD4gbWE7CiAKdm9pZCBpbnMoaW50IGEsIGludCBiLCBpbnQgYykKewoJaWYocy5zaXplKCkgPiBNWCkgcmV0dXJuIDsKCS8vaW50IHhbM107CgkvL3hbMF09YTsgeFsxXT1iOyB4WzJdPWM7CgkvL3NvcnQoeCx4KzMpOwoJLy9zLmluc2VydChtcChtcCh4WzBdLHhbMV0pLHhbMl0pKTsKCWlmKGE+Yikgc3dhcChhLGIpOwoJaWYoYT5jKSBzd2FwKGEsYyk7CglpZihiPmMpIHN3YXAoYixjKTsKCXMuaW5zZXJ0KG1wKG1wKGEsYiksYykpOwp9CiAKaW50IG4sIG07CiAKYm9vbCBoZWF2eShpbnQgdSkKewoJaWYoYWRqW3VdLnNpemUoKSA+PSBDKSByZXR1cm4gdHJ1ZTsKCXJldHVybiBmYWxzZTsKfQogCmxsIGFuc2hlYXZ5OwpsbCBhbnNsaWdodDsKIAp2b2lkIHByb2Nlc3NoZWF2eShpbnQgeCkKewoJZm9yKGludCBpID0gMDsgaSA8IG07IGkrKykKCXsKCQlpbnQgaGVhdnljbnQgPSAxOwoJCWludCB1ID0gZWRnZXNbaV0uZmkuZmk7IGludCB2ID0gZWRnZXNbaV0uZmkuc2U7IGludCBjID0gZWRnZXNbaV0uc2U7CgkJaWYodT09eHx8dj09eCkgY29udGludWU7CgkJaWYoaGVhdnkodSkpIGhlYXZ5Y250Kys7CgkJaWYoaGVhdnkodikpIGhlYXZ5Y250Kys7CgkJaW50IGMxID0gbWFbaHNoKHUseCldOwoJCWludCBjMiA9IG1hW2hzaCh2LHgpXTsKCQlpZihjMT09MHx8YzI9PTApIGNvbnRpbnVlOwoJCWlmKGMhPWMxJiZjMSE9YzImJmMhPWMyKQoJCXsKCQkJaW5zKHgsdSx2KTsKCQkJaWYoaGVhdnljbnQ9PTMpCgkJCXsKCQkJCWFuc2hlYXZ5Kz0yOwoJCQl9CgkJCWVsc2UgaWYoaGVhdnljbnQ9PTIpCgkJCXsKCQkJCWFuc2hlYXZ5Kz0zOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJYW5zaGVhdnkrPTY7CgkJCX0KCQl9Cgl9CQp9CiAKdm9pZCBwcm9jZXNzbGlnaHQoaW50IHUsIGludCB2LCBpbnQgYykKewoJZm9yKGludCBpID0gMDsgaSA8IGFkalt1XS5zaXplKCk7IGkrKykKCXsKCQlpbnQgdyA9IGFkalt1XVtpXS5maTsgaW50IGMxID0gYWRqW3VdW2ldLnNlOwoJCWlmKGhlYXZ5KHcpKSBjb250aW51ZTsKCQlpbnQgYzIgPSBtYVtoc2godix3KV07CgkJaWYoYzI9PTApIGNvbnRpbnVlOwoJCWlmKGMxIT1jMiYmYzIhPWMmJmMhPWMxKQoJCXsKCQkJYW5zbGlnaHQrKzsKCQkJaW5zKHUsdix3KTsKCQl9CQoJfQp9CiAKaW50IG1haW4oKQp7Cglpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKDApOwoJaW50IGs7CgljaW4+Pm4+Pm0+Pms7CglDID0gNDUwOwoJZm9yKGludCBpID0gMDsgaSA8IG07IGkrKykKCXsKCQlpbnQgdSwgdiwgYzsKCQljaW4+PnU+PnY+PmM7CgkJdS0tOyB2LS07CgkJbWFbaHNoKHUsdildID0gYzsKCQltYVtoc2godix1KV0gPSBjOwoJCWFkalt1XS5wYihtcCh2LGMpKTsKCQlhZGpbdl0ucGIobXAodSxjKSk7CgkJZWRnZXMucGIobXAobXAodSx2KSxjKSk7Cgl9Cglmb3IoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQoJewoJCWlmKGhlYXZ5KGkpKQoJCXsKCQkJcHJvY2Vzc2hlYXZ5KGkpOwoJCX0KCX0KCWZvcihpbnQgaSA9IDA7IGkgPCBtOyBpKyspCgl7CgkJaW50IHUgPSBlZGdlc1tpXS5maS5maTsgaW50IHYgPSBlZGdlc1tpXS5maS5zZTsgaW50IGMgPSBlZGdlc1tpXS5zZTsKCQlpZihoZWF2eSh1KXx8aGVhdnkodikpIGNvbnRpbnVlOwoJCXByb2Nlc3NsaWdodCh1LHYsYyk7Cgl9CglhbnNoZWF2eS89NjsKCWFuc2xpZ2h0Lz0zOwoJbGwgYW5zID0gYW5zaGVhdnkgKyBhbnNsaWdodDsKCWNvdXQ8PGFuczw8J1xuJzsKCWlmKGFucyA8PSBNWCkKCXsKCQlmb3Ioc2V0PHBhaXI8aWksaW50PiA+OjppdGVyYXRvciBpdCA9IHMuYmVnaW4oKTsgaXQgIT0gcy5lbmQoKTsgaXQrKykKCQl7CgkJCWNvdXQgPDwgKCppdCkuZmkuZmkrMSA8PCAnICcgPDwgKCppdCkuZmkuc2UgKyAxIDw8ICcgJyA8PCAoKml0KS5zZSArIDEgPDwgJ1xuJzsKCQl9Cgl9Cn0KIA==