//暴力解法:照着题目说的统计权重,然后使用map存储结果输出即可
#include <iostream>
#include<cstring>
#include<string>
#include<vector>
#include<map>
const int maxn = 26;
using namespace std;
int father[maxn];
int height[maxn];
int phone[maxn];
void init(int n) {
for (int i = 0; i < n; i++) {
father[i] = i;
height[i] = 0;
phone[i] = 0;
}
}
int find(int x) {
if (x != father[x]) {
x = father[x];
}
return father[x];
}
void Union(int x, int y) {
x = find(x);
y = find(y);
if (x != y) {
if (height[x] < height[y]) {
father[x] = y;
} else if (height[x] > height[y]) {
father[y] = x;
} else {
father[y] = x;
height[x] += 1;
}
}
}
int countFather(int x) {
int count = 0;
for (int i = 0; i < maxn; i++) {
if (find(i) == find(x)) {
count++;
}
}
return count;
}
int main() {
int num, weight;
string a, b;
int numa, numb, minute; //通话时长
while (cin >> num >> weight) { // 注意 while 处理多个 case
map<int, int> result;
map<int, string> m;
init(maxn);
while (num--) {
cin >> a >> b >> minute;
numa = a[0] - 'A';
numb = b[0] - 'A';
m[numa] = a;
m[numb] = b;
phone[numa] += minute;
phone[numb] += minute;
Union(numa, numb);
}
for (int i = 0; i < maxn; i++) {
if (i == find(i) && countFather(i) > 2) {
int sumWeight, maxWeight, maxIndex;
sumWeight = 0;
maxWeight = 0;
maxIndex = 0;
for (int j = 0; j < maxn; j++) {
if (find(j) == i) {
sumWeight += phone[j];
if (phone[j] > maxWeight) {
maxWeight = phone[j];
maxIndex = j;
}
}
}
sumWeight /= 2;
if (sumWeight > weight) {
result[maxIndex] = countFather(i);
}
}
}
cout << result.size() << endl;
map<int, int>::iterator it;
for (it = result.begin(); it != result.end(); it++) {
cout << m[it->first] << " " << it->second << endl;
}
}
}
// 64 位输出请用 printf("%lld")