#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
const long long mod = (1LL << 32), inf = 3e9, mxn = 1e5 + 10;
set<int> co[mxn];
int ile[mxn];
vector<pair<int, pair<int, int> > > ans;
void tran(int sk, int dok, int ile) {
  set<int>::iterator it1, it2;
  vector<int> vec;
  it2 = co[dok].begin();
  for (it1 = co[sk].begin(); it1 != co[sk].end(); it1++) {
    while (it2 != co[dok].end() && (*it2) < (*it1)) {
      it2++;
    }
    if ((it2 == co[dok].end()) || (*it1) != (*it2)) {
      vec.push_back((*it1));
      if (vec.size() == ile) {
        break;
      }
    }
  }
  for (int i = 0; i < vec.size(); i++) {
    ans.push_back(make_pair(sk, make_pair(dok, vec[i])));
    co[sk].erase(vec[i]);
    co[dok].insert(vec[i]);
  }
}
int main() {
  int n, m, i, a, j, su = 0;
  cin >> n >> m;
  for (i = 1; i <= n; i++) {
    cin >> ile[i];
    su += ile[i];
    for (j = 0; j < ile[i]; j++) {
      cin >> a;
      co[i].insert(a);
    }
  }
  if (su % n == 0) {
    int cel = su / n;
    deque<int> dod, odj;
    for (i = 1; i <= n; i++) {
      if (co[i].size() > cel) {
        dod.push_back(i);
      } else if (co[i].size() < cel) {
        odj.push_back(i);
      }
    }
    while (dod.size()) {
      tran(dod[0], odj[0],
           min(-cel + co[dod[0]].size(), -co[odj[0]].size() + cel));
      if (cel == co[dod[0]].size()) {
        dod.pop_front();
      }
      if (cel == co[odj[0]].size()) {
        odj.pop_front();
      }
    }
    cout << ans.size() << "\n";
    for (i = 0; i < ans.size(); i++) {
      cout << ans[i].first << " " << ans[i].second.first << " "
           << ans[i].second.second << "\n";
    }
    return 0;
  }
  int dol = su / n;
  int gu = dol + 1;
  deque<int> dod, odj;
  for (i = 1; i <= n; i++) {
    if (co[i].size() > gu) {
      dod.push_back(i);
    } else if (co[i].size() < dol) {
      odj.push_back(i);
    }
  }
  while (dod.size() > 0 && odj.size() > 0) {
    tran(dod[0], odj[0],
         min(-gu + co[dod[0]].size(), -co[odj[0]].size() + dol));
    if (gu == co[dod[0]].size()) {
      dod.pop_front();
    }
    if (dol == co[odj[0]].size()) {
      odj.pop_front();
    }
  }
  if (dod.size()) {
    for (int i = 1; dod.size() && i <= n; i++) {
      if (co[i].size() == dol) {
        tran(dod[0], i, 1);
      }
      if (gu == co[dod[0]].size()) {
        dod.pop_front();
      }
    }
  }
  if (odj.size()) {
    for (int i = 1; odj.size() && i <= n; i++) {
      if (co[i].size() == gu) {
        tran(i, odj[0], 1);
      }
      if (dol == co[odj[0]].size()) {
        odj.pop_front();
      }
    }
  }
  cout << ans.size() << "\n";
  for (i = 0; i < ans.size(); i++) {
    cout << ans[i].first << " " << ans[i].second.first << " "
         << ans[i].second.second << "\n";
  }
}
