#include <bits/stdc++.h>
using namespace std;
struct Node {
  int num, tar, id;
};
struct Node2 {
  int from, to, val;
};
const int N = 1e5 + 10;
set<int> s[N];
Node a[N];
Node2 ans[500010];
int main() {
  int n, m, sum, p1, p2, tot;
  scanf("%d %d", &n, &m);
  sum = 0;
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i].num);
    for (int j = 1, x; j <= a[i].num; j++) {
      scanf("%d", &x);
      s[i].insert(x);
    }
    a[i].id = i;
    sum += a[i].num;
  }
  sort(a + 1, a + n + 1, [&](Node x, Node y) { return x.num < y.num; });
  for (int i = 1; i <= n; i++) a[i].tar = (sum + i - 1) / n;
  p1 = 1;
  p2 = n;
  tot = 0;
  while (true) {
    while (p1 < p2 && a[p1].num == a[p1].tar) p1++;
    if (p1 >= p2) break;
    while (p2 > p1 && a[p2].num == a[p2].tar) p2--;
    if (p1 >= p2) break;
    auto it2 = s[a[p2].id].begin();
    while (a[p1].num < a[p1].tar && a[p2].num > a[p2].tar) {
      auto it = s[a[p1].id].lower_bound(*it2);
      if (it == s[a[p1].id].end() || (*it2) != (*it)) {
        ans[++tot] = (Node2){a[p2].id, a[p1].id, *it2};
        s[a[p1].id].insert(*it2);
        it2 = s[a[p2].id].erase(it2);
        a[p1].num++;
        a[p2].num--;
      } else
        it2++;
    }
  }
  printf("%d\n", tot);
  for (int i = 1; i <= tot; i++)
    printf("%d %d %d\n", ans[i].from, ans[i].to, ans[i].val);
  return 0;
}
