#include <bits/stdc++.h>
using namespace std;
map<string, long long> v;
map<long long, string> v1;
map<long long, map<long long, long long>> taken;
struct record {
  long long node, cost;
  record(long long node, long long cost) {
    this->node = node;
    this->cost = cost;
  }
};
struct r {
  string n, n1;
  r(string n, string n1) {
    this->n = n;
    this->n1 = n1;
  }
};
vector<record> v2[5001];
vector<r> v4;
int main() {
  long long n, m, i, d, j, k;
  cin >> n >> m;
  string x, y;
  int co = 0;
  for (i = 1; i <= n; i++) {
    cin >> x >> y >> d;
    if (v[x] == 0) {
      co++;
      v[x] = co;
      v1[co] = x;
    }
    if (v[y] == 0) {
      co++;
      v[y] = co;
      v1[co] = y;
    }
    v2[v[x]].push_back(record(v[y], d));
  }
  long long path;
  for (i = 1; i <= co; i++) {
    for (j = 0; j < v2[i].size(); j++) {
      path = v2[i][j].node;
      int check = 0;
      for (k = 0; k < v2[path].size(); k++) {
        if (taken[i][path] == 1 || taken[path][i] == 1) break;
        if (v2[path][k].node == i) {
          long long a = v2[i][j].cost;
          long long b = v2[path][k].cost;
          if (abs(a - b) <= m && abs(a - b) > 0) {
            check = 1;
            break;
          }
        }
      }
      if (check == 1) {
        v4.push_back((r(v1[i], v1[path])));
        taken[i][path] = 1;
      }
    }
  }
  cout << v4.size() << "\n";
  for (i = 0; i < v4.size(); i++) {
    cout << v4[i].n << " " << v4[i].n1 << "\n";
  }
}
