#include<iostream>
#include<string>
#include<map>
using namespace std;
int n, k;
bool vis[3000] = { false };
int G[3000][3000] = { 0 }, weigth[3000] = { 0 };
int person = 0;
map<string, int> stringToint;
map<int,string> intTostring;
map<string,int>gang;
void dfs(int nowvisit, int &head, int &num, int &value)//value 为连通块(一个犯罪团伙)的总权值;
{
num++;
vis[nowvisit] = true;
if (weigth[nowvisit] > weigth[head])
{
head = nowvisit;
}
for (int i = 0; i < person; i++)
{
if (G[nowvisit][i] > 0)
{
value += G[nowvisit][i];
G[nowvisit][i] = G[i][nowvisit] = 0;
if (vis[i] == false)
{
dfs(i, head, num, value);
}
}
}
}
void dfstrave(){
for (int j = 0; j < person; j++)
{
if (vis[j] == false)
{
int head = j, num = 0, value = 0;
dfs(j, head, num, value);
if (value>k && num > 2)
{
gang[intTostring[head]] = num;
}
}
}
}
int change(string str){
if (stringToint.find(str) != stringToint.end())
return stringToint[str];
else{
stringToint[str] = person;
intTostring[person] = str;
return person++;//返回的值为person,实际上person已经为person+1;
}
}
int main(){
int w;
string str1, str2;
cin >> n >> k;
for (int i = 0; i < n; i++)
{
cin >> str1 >> str2 >> w;
int id1 = change(str1);
int id2 = change(str2);
weigth[id1] += w;
weigth[id2] += w;
G[id1][id2] += w;
G[id2][id1] += w;
}
dfstrave();
cout << gang.size() << endl;
map<string, int>::iterator it;
for (it = gang.begin(); it != gang.end(); it++)
{
cout << it->first << " " << it->second << endl;
}
return 0;
}