#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
const int N = 1e5 + 10;
struct kek {
  long long l, r, sum;
};
struct lol {
  long long x, y, z;
};
vector<kek> t[N];
long long ans;
void add(long long now) { t[now].push_back({-1, -1, 0}); }
void modify(long long now, long long w, long long tl, long long tr,
            long long pos, long long val) {
  if (tl == tr)
    t[now][w].sum = val;
  else {
    if (t[now][w].r == -1) {
      t[now][w].r = t[now].size();
      add(now);
    }
    if (t[now][w].l == -1) {
      t[now][w].l = t[now].size();
      add(now);
    }
    long long c = (tl + tr) / 2;
    if (pos <= c)
      modify(now, t[now][w].l, tl, c, pos, val);
    else
      modify(now, t[now][w].r, c + 1, tr, pos, val);
    t[now][w].sum = t[now][t[now][w].l].sum + t[now][t[now][w].r].sum;
  }
}
void dfs(long long big, long long small, long long W, long long w, long long tl,
         long long tr) {
  if (ans != INF) return;
  if (tl == tr)
    ans = tl;
  else {
    long long TOL = t[big][W].l, TOR = t[big][W].r, tol = t[small][w].l,
              tor = t[small][w].r;
    if (TOL == -1) {
      t[big][W].l = t[big].size();
      TOL = t[big].size();
      add(big);
    }
    if (TOR == -1) {
      t[big][W].r = t[big].size();
      TOR = t[big].size();
      add(big);
    }
    if (tol == -1) {
      t[small][w].l = t[small].size();
      tol = t[small].size();
      add(small);
    }
    if (tor == -1) {
      t[small][w].r = t[small].size();
      tor = t[small].size();
      add(small);
    }
    long long c = (tl + tr) / 2;
    if (t[big][TOL].sum > t[small][tol].sum)
      dfs(big, small, TOL, tol, tl, c);
    else
      dfs(big, small, TOR, tor, c + 1, tr);
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  long long n, m, k, i, j, x;
  set<pair<long long, long long> > st;
  cin >> n >> m;
  for (i = 1; i <= n; ++i) {
    add(i);
    cin >> k;
    st.insert({k, i});
    while (k--) {
      cin >> x;
      modify(i, 0, 1, m, x, 1);
    }
  }
  vector<lol> way;
  while (st.size() > 1) {
    auto it = st.begin();
    long long x = (*it).first;
    long long y = (*it).second;
    it = st.end();
    --it;
    long long a = (*it).first;
    long long b = (*it).second;
    if (a - x > 1) {
      ans = INF;
      dfs(b, y, 0, 0, 1, m);
      modify(b, 0, 1, m, ans, 0);
      modify(y, 0, 1, m, ans, 1);
      way.push_back({b, y, ans});
      st.erase({x, y});
      st.insert({x + 1, y});
      st.erase({a, b});
      st.insert({a - 1, b});
    } else
      break;
  }
  cout << way.size() << endl;
  for (auto it : way) cout << it.x << " " << it.y << " " << it.z << "\n";
}
