#include <bits/stdc++.h>
using namespace std;
long long b[1001];
bool comper(char c1, char c2) {
  if ((c1 >= 'A' && c1 <= 'Z' && c2 >= 'A' && c2 <= 'Z') ||
      (c1 >= 'a' && c1 <= 'z' && c2 >= 'a' && c2 <= 'z'))
    return c1 < c2;
  else if (c1 >= 'A' && c1 <= 'Z' && c2 >= 'a' && c2 <= 'z') {
    char upper = toupper(c2);
    if (c1 == upper)
      return c2 > c1;
    else {
      char c = tolower(c1);
      return c <= c2;
    }
  } else if (c1 >= 'a' && c1 <= 'z' && c2 >= 'A' && c2 <= 'Z') {
    char upper = toupper(c1);
    if (c2 == upper)
      return c1 < c2;
    else {
      char c = tolower(c2);
      return c > c1;
    }
  }
}
void KMPpre(string p) {
  long long j = -1, i = 0;
  b[0] = -1;
  while (i < p.size()) {
    while (j >= 0 && p[j] != p[i]) j = b[j];
    i++;
    j++;
    p[i] = j;
  }
}
bool KMPsearch(string t, string p) {
  long long i = 0, j = 0;
  while (i < t.size()) {
    while (j >= 0 && t[i] != p[j]) j = b[j];
    i++;
    j++;
    if (j == p.size()) {
      return true;
    }
  }
  return false;
}
int main() {
  int n, d;
  cin >> n >> d;
  vector<pair<pair<string, string>, int>> v;
  for (long long i = 0; i < n; i++) {
    string s1, s2;
    int t;
    cin >> s1 >> s2 >> t;
    v.push_back(
        pair<pair<string, string>, int>(pair<string, string>(s1, s2), t));
  }
  set<pair<string, string>> sp;
  for (long long i = 0; i < v.size(); i++) {
    for (long long j = i; j < v.size(); j++) {
      if (v[i].first.first == v[j].first.second &&
          v[i].first.second == v[j].first.first)
        if (abs(v[i].second - v[j].second) <= d &&
            abs(v[i].second - v[j].second) > 0) {
          sp.insert(make_pair(min(v[i].first.first, v[i].first.second),
                              max(v[i].first.first, v[i].first.second)));
        }
    }
  }
  cout << sp.size() << endl;
  for (set<pair<string, string>>::iterator it = sp.begin(); it != sp.end();
       it++) {
    cout << it->first << " " << it->second << endl;
  }
}
