//weight权重 total time总时间 of all在所有…中 length长长度
//phone calls打电话 between the two在两者之间 Gang帮派,一群
//a cluster of一组一群 more than超过,超出 each other彼此,互相
//greater than大于 threshold阈值,门槛 total weight总重量
//a string of一串 capital大写字母 letters字母,信 sorted把…分类整理
//according to根据,按照 alphabetical按字母顺序排列的 heads头,头部
//The weight of a relation is defined to be the total time length of all the phone calls made between the two persons.
//关系的权重被定义为两个人之间所有电话的总时间长度。
// A "Gang" is a cluster of more than 2 persons who are related to each other with total relation weight being greater than a given threshold K. In each gang,
//“帮派”是由两个以上相互关联的人组成的群体,总关系权重大于给定的阈值K。
//the one with maximum total weight is the head.
//在每个帮派中,总权重最大的是头部。
//the number of phone calls and the weight threthold, respectively.
//分别表示通话数量以及权重阈值。
//A name is a string of three capital letters chosen from A-Z.
//名字是从A-Z中选择的三个大写字母的字符串。
//The output must be sorted according to the alphabetical order of the names of the heads.
//输出必须按照负责人姓名的字母顺序排序。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<unordered_map>
using namespace std;
//每个帮派要满足三个条件 1.是一个连通块 2.连通块至少包含三个点 3.连通块里面所有边的长度严格大于k
//统计每个帮派,统计每个帮派通话时间最久的那个
//找连通块---用图的遍历BFS,DFS都可(一般用DFS少写队列)
//DFS记录两个信息 1.总边权(无向图,遍历两次,算的总边权要除以2) 2.所有点的名字存下来
//判断总边权是否>k;枚举所有点看哪一个点通话时间最久(即帮派的头目)
int n,k;
unordered_map<string,vector<pair<string,int>>> g;//存下来这个点可以到哪些点,所以用vector<pair<string,int>来存可以到的所有边
//每条边有两条信息,1.边是什么 2.边的权值是什么 pair<string,int>
unordered_map<string,int> total;
unordered_map<string,bool> st;//判重数组,保证每个点只搜一次
int dfs(string ver,vector<string> &nodes)
{
st[ver] = true;
nodes.push_back(ver);
int sum = 0;
for(auto edge:g[ver])//找一下所有ver能到的点
{
sum += edge.second;//加上全值
string cur = edge.first;//新的点
if(!st[cur]) sum += dfs(cur,nodes);//新点没有被搜过
}
return sum;
}
int main()
{
cin>>n>>k;
while(n--)
{
string a,b;
int t;
cin>>a>>b>>t;
g[a].push_back({b,t});
g[b].push_back({a,t});
total[a] += t;
total[b] += t;
}
vector<pair<string,int>> res;//答案1.头目名字2.帮派人数
for(auto item:total)//遍历所有的人
{
string ver = item.first;
vector<string> nodes;//存一下所有的人
int sum = dfs(ver,nodes)/2;
if(nodes.size() > 2 && sum>k)
{
string boss = nodes[0];
for(string node:nodes)
if(total[boss] < total[node])
boss = node;
res.push_back({boss,(int)nodes.size()});
}
}
sort(res.begin(),res.end());
cout<<res.size()<<endl;
for(auto item:res) cout<<item.first<<' '<<item.second<<endl;
return 0;
}