#include <bits/stdc++.h>
using namespace std;
map<string, int> mp;
map<int, string> g;
int n, k, cnt;
char name1[10100][30], name2[10100][30];
int mark[1010][1010];
int x[10100], y[10100], tt[10100];
int ans[10100], num;
struct Node {
  int l, r;
} node[10100];
struct Mark {
  int l, r;
  Mark() {}
  Mark(int a, int b) {
    if (a > b) swap(a, b);
    l = a;
    r = b;
  }
  bool operator<(const Mark a) const {
    if (l == a.l) return r < a.r;
    return l < a.l;
  }
};
map<Mark, int> vis;
int vv;
int main() {
  string s1, s2;
  int u, v, t;
  while (scanf("%d%d", &n, &k) == 2) {
    cnt = 0;
    num = 0;
    vv = 0;
    vis.clear();
    mp.clear();
    for (int i = 0; i < n; i++) {
      scanf("%s%s%d", name1[i], name2[i], &t);
      s1 = name1[i];
      s2 = name2[i];
      if (!mp.count(s1)) {
        mp[s1] = ++cnt;
        g[cnt] = s1;
      }
      u = mp[s1];
      if (!mp.count(s2)) {
        mp[s2] = ++cnt;
        g[cnt] = s2;
      }
      v = mp[s2];
      x[i] = u;
      y[i] = v;
      tt[i] = t;
      for (int j = 0; j < n; j++) {
        if (tt[i] != tt[j] && tt[i] - tt[j] <= k) {
          if (x[i] == y[j] && x[j] == y[i]) {
            if (!vis.count(Mark(x[i], y[i]))) {
              node[num].l = x[i];
              node[num++].r = y[i];
              vis[Mark(x[i], y[i])] = vv++;
            }
          }
        }
      }
    }
    printf("%d\n", num);
    for (int i = 0; i < num; i++)
      cout << g[node[i].l] << " " << g[node[i].r] << endl;
  }
  return 0;
}
