//土尔逊Torson 编写于2023/07/04
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <cstring>
#include <vector>
#include <map>
using namespace std;
map<string, string>BOSS;
map<string, int> weight;
map<string, int>gang_weight;
string Find13401(string name) {
if (BOSS.find(name) != BOSS.end()) {
if (BOSS[name] != name) {
return Find13401(BOSS[name]);
}
}
else {
BOSS[name] = name;
}
return BOSS[name];
}
void Union13401(string x, string y) {
x = Find13401(x);
y = Find13401(y);
BOSS[x] = y;
}
int main() {
int n, k;
while (scanf("%d%d", &n, &k) != EOF) {
for (int i = 0; i < n; ++i) {
string name1, name2;
int time;
cin >> name1 >> name2 >> time;
Union13401(name1, name2);
weight[name1] += time, weight[name2] += time;
}
vector<string> gang_leader;
for (auto it = BOSS.begin(); it != BOSS.end(); ++it) {
if (it->first == it->second) {
gang_leader.push_back(it->second);
}
}
int gangs = 0;
vector<string> gang_name;
vector<int> gang_member;
for (int i = 0; i < gang_leader.size(); ++i) {
int member = 0;
int weight_sum = 0;
int leader_weight = 0;
string leader_name;
for (auto it = BOSS.begin(); it != BOSS.end(); ++it) {
if (Find13401(it->first) == gang_leader[i]) {
if (weight[it->first] > leader_weight) {
leader_weight = weight[it->first];
leader_name = it->first;
}
weight_sum += weight[it->first];
member++;
}
}
if (member >= 3 && weight_sum > k * 2) {
gangs++;
gang_name.push_back(leader_name);
gang_member.push_back(member);
}
}
printf("%d\n", gangs);
for (int i = 0; i < gangs; ++i) {
printf("%s %d\n", gang_name[i].c_str(), gang_member[i]);
}
BOSS.clear();
weight.clear();
}
system("pause");
return EXIT_SUCCESS;
}
// 64 位输出请用 printf("%lld")