#include<iostream>
#include<map>
using namespace std;
int N,K,cnt=1,e[2010][2010]={0},weight[2010]={0};
map<string,int> stringToInt,ans;
map<int,string> intToString;
bool vis[2010]={false};
int getID(string name){
if(stringToInt[name]==0){
stringToInt[name]=cnt;
intToString[cnt]=name;
return cnt++;
}
return stringToInt[name];
}
void dfs(int index,int &head,int &numMember,int &totalWeight){
numMember++;
if(weight[index]>weight[head])
head=index;
vis[index]=true;
for(int i=1;i<cnt;i++){
if(e[index][i]!=0){//形成环的时候边权要加,但是可能对应的顶点已经在之间访问过了
totalWeight+=e[index][i];
e[index][i]=e[i][index]=0;
if(vis[i]==false){
vis[i]=true;
dfs(i,head,numMember,totalWeight);
}
}
}
}
void dfsTraversal(){
for(int i=1;i<cnt;i++){
if(vis[i]==false){
int head=i,numMember=0,totalWeight=0;
dfs(i,head,numMember,totalWeight);
if(numMember>2&&totalWeight>K)
ans[intToString[head]]=numMember;
}
}
}
int main(){
string name1,name2;
int t;
scanf("%d%d",&N,&K);
for(int i=0;i<N;i++){
cin>>name1>>name2>>t;
int id1=getID(name1);
int id2=getID(name2);
weight[id1]+=t;
weight[id2]+=t;
e[id1][id2]+=t;
e[id2][id1]+=t;
}
dfsTraversal();
printf("%d\n",ans.size());
for(map<string,int>:: iterator it=ans.begin();it!=ans.end();it++){
cout<<it->first<<" "<<it->second<<endl;
}
}