统计连通分量就行了
#include<iostream>
#include<algorithm>
#include<string>
#include<set>
#include<map>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
#define ll long long
#define read(x) scanf("%lld",&x)
const ll inf=0x3f3f3f3f;
map<string,ll>id;
map<ll,string>id2;
struct node
{
ll to,len;
node(ll x,ll y)
{
to=x;len=y;
}
/* data */
};
vector<node>ve[100005];
ll vis[100005];
vector<ll>ans;
void dfs(int x)
{
ans.push_back(x);
for(int i=0;i<ve[x].size();i++)
{
if(!vis[ve[x][i].to])
{
vis[ve[x][i].to]=1;
dfs(ve[x][i].to);
}
}
}
ll tim[100005];
struct node2
{
string name;
ll val;
node2(string x,ll y)
{
name=x;val=y;
}
/* data */
};
bool cmp(node2 x,node2 y)
{
return x.name<y.name;
}
int main()
{
ll n,shold;
read(n);read(shold);
ll nob=1;
for(int i=0;i<n;i++)
{
string t1,t2;ll t3;
cin>>t1>>t2;read(t3);
if(id[t1]==0)id2[nob]=t1,id[t1]=nob++;
if(id[t2]==0)id2[nob]=t2,id[t2]=nob++;
ve[id[t1]].push_back(node(id[t2],t3));
}
ll num=0;
vector<node2>ans2;
for(int i=1;i<nob;i++)
{
ans.clear();
if(!vis[i])
{
vis[i]=1;
dfs(i);
}
if(ans.size()<3)continue;
ll sum=0,maxn=0,maxid;
for(int i=0;i<ans.size();i++)
{
for(int j=0;j<ve[ans[i]].size();j++)
{
sum+=ve[ans[i]][j].len;
tim[ans[i]]+=ve[ans[i]][j].len;
tim[ve[ans[i]][j].to]+=ve[ans[i]][j].len;
}
}
if(sum<=shold)continue;
for(int i=0;i<ans.size();i++)
{
if(tim[ans[i]]>maxn)
{
maxn=tim[ans[i]];
maxid=ans[i];
}
}
ans2.push_back(node2(id2[maxid],ans.size()));
num++;
}
sort(ans2.begin(),ans2.end(),cmp);
cout<<num<<'\n';
for(int i=0;i<ans2.size();i++)
{
cout<<ans2[i].name<<' '<<ans2[i].val<<'\n';
}
}