#include <bits/stdc++.h>
using namespace std;
long long mod = 1000000007LL;
long long large = 2000000000000000000LL;
int main() {
  int n, m;
  cin >> n >> m;
  vector<vector<int> > a(n, vector<int>());
  for (int i = 0; i < n; i++) {
    int x;
    scanf("%d", &x);
    a[i].assign(x, 0);
    for (int j = 0; j < x; j++) {
      scanf("%d", &a[i][j]);
      a[i][j]--;
    }
  }
  int s = 0;
  for (int i = 0; i < n; i++) s += (int)a[i].size();
  int ub = (s - 1) / n + 1;
  int lb = s / n;
  vector<set<int> > adj;
  adj.assign(n, set<int>());
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < (int)a[i].size(); j++) adj[i].insert(a[i][j]);
  }
  vector<pair<pair<int, int>, int> > e;
  vector<int> u, l;
  for (int i = 0; i < n; i++) {
    if ((int)a[i].size() >= ub) u.push_back(i);
    if ((int)a[i].size() <= lb) l.push_back(i);
  }
  int q = (int)u.size() - (s % n);
  int lp = 0;
  int rp = 0;
  while (lp < (int)l.size() && rp < (int)u.size()) {
    set<int>::iterator it = adj[u[rp]].begin();
    vector<int> toe;
    while ((int)adj[u[rp]].size() - (int)toe.size() > (q > 0 ? lb : ub) &&
           (int)adj[l[lp]].size() < (q < 0 ? ub : lb)) {
      int x = *it;
      if (adj[l[lp]].find(x) == adj[l[lp]].end()) {
        toe.push_back(x);
        adj[l[lp]].insert(x);
        e.push_back(pair<pair<int, int>, int>(pair<int, int>(u[rp], l[lp]), x));
      }
      it++;
    }
    while (!toe.empty()) {
      adj[u[rp]].erase(toe.back());
      toe.pop_back();
    }
    if ((int)adj[u[rp]].size() == (q > 0 ? lb : ub)) {
      if ((int)adj[u[rp]].size() == lb) q--;
      rp++;
    }
    if ((int)adj[l[lp]].size() == (q < 0 ? ub : lb)) {
      if ((int)adj[l[lp]].size() == ub) q++;
      lp++;
    }
  }
  cout << e.size() << endl;
  for (int i = 0; i < (int)e.size(); i++) {
    printf("%d %d %d\n", e[i].first.first + 1, e[i].first.second + 1,
           e[i].second + 1);
  }
  return 0;
}
