#include<bits/stdc++.h>
using namespace std;
const int MAXN=2010;
const int INF=1000000000;
struct Node{
int time;
}node[MAXN];
map<string,int> sti;
map<int,string> its;
map<string,int> ppp;
int cnt=0;
int G[MAXN][MAXN]={0};
int n,k;
bool vis[MAXN]={false};
void dfs(int v,int &numnode,int &sum,int &head){
if(vis[v]==false){
numnode++;
vis[v]=true;
if(node[head].time<node[v].time){
head=v;
}
}
for(int i=0;i<sti.size();i++){
if(G[v][i]>0){
sum+=G[v][i];
G[v][i]=G[i][v]=0;
if(vis[i]==false)
dfs(i,numnode,sum,head);
}
}
}
int dfstra(){
for(int i=0;i<sti.size();i++){
if(vis[i]==false){
int numnode=0,sum=0,head=i;
dfs(i,numnode,sum,head);
if(numnode>2&&sum>k){
ppp[its[head]]=numnode;
cnt++;
}
}
}
return cnt;
}
int main()
{
freopen("in.txt","r",stdin);
cin>>n>>k;
int j=0;
//fill(G[0],G[0]+MAXN*MAXN,INF);
for(int i=0;i<n;i++){
string name1,name2;int time1;
cin>>name1>>name2>>time1;
if(sti.find(name1)==sti.end()){
sti[name1]=j;
its[j]=name1;
j++;
}
if(sti.find(name2)==sti.end()){
sti[name2]=j;
its[j]=name2;
j++;
}
G[sti[name1]][sti[name2]]+=time1;
G[sti[name2]][sti[name1]]+=time1;
node[sti[name1]].time+=time1;
node[sti[name2]].time+=time1;
}
int num=dfstra();
cout<<num<<endl;
for(auto it=ppp.begin();it!=ppp.end();it++){
cout<<it->first<<' '<<it->second<<endl;
}
return 0;
}
G数组必须用0表示不可达,注意map第一键值必须是string,不然三个测试点过不了,应该就是排序的问题