#include<iostream>
#include<unordered_map>
#include<string>
#include<map>
#include<vector>
using namespace std;
const int N = 1010;
unordered_map<string, string>p;
unordered_map<string, int>gtime;
unordered_map<string, int>visit;
typedef pair<string, string> PSS;
string find(string str) {
if (p[str] != str)p[str] = find(p[str]);
return p[str];
}
void Union(string str1, string str2) {
if (find(str1) != find(str2)) {
//因为每个黑帮的头目是通话时间最长的
//这里比较大小要比较根的大小,不然一下左插入,一下右插入会出错
//这里要比较根的大小,一直让根的大小是最大的元素值,最后就是黑帮头目
//若不用合并,则是同一个集合的,那么根结点和另外一个结点的权值都要加,所以肯定还是根结点是头目
//只有要合并时才有可能更换头目
if (gtime[find(str1)] < gtime[find(str2)])p[find(str1)] = find(str2);
else p[find(str2)] = find(str1);
}
}
int main() {
int n, k;
while (cin >> n >> k) {
vector<PSS> v;
while (n--) {
string str1, str2;
int weight;
cin >> str1 >> str2 >> weight;
if (visit.count(str1) == 0) {
p[str1] = str1;
visit[str1] = 1;
}
if (visit.count(str2) == 0) {
p[str2] = str2;
visit[str2] = 1;
}
gtime[str1] += weight;
gtime[str2] += weight;
v.push_back(make_pair(str1, str2));
//由于要找黑帮头目,得知道所有人的童话时间才能合并
/*Union(str1, str2);*/
}
for (auto it = v.begin(); it != v.end(); it++) {
Union(it->first, it->second);
}
//这里用map就默认字典序了
map<string, int>sum;
map<string, int>count;
for (auto it = p.begin(); it != p.end(); it++) {
string root = find(it->first);
sum[root] = sum[root] + gtime[it->first];
count[root]++;
}
//由于本题还要先提前输出有几个帮派,只能把结果保存下来
//由于将所有时间都加起来,相当于通话时间乘了两倍
map<string, int>res;
for (auto it = sum.begin(); it != sum.end(); it++) {
if (sum[it->first] > k*2 && count[it->first] > 2) {
res[it->first] = count[it->first];
}
}
cout << res.size() << endl;
for (auto it = res.begin(); it != res.end(); it++) {
cout << it->first << ' ' << it->second << endl;
}
//新的一组要清空数据
p.clear();
gtime.clear();
visit.clear();
}
return 0;
}
//题目有难读懂,还容易错,好烦啊