#include <bits/stdc++.h>
using namespace std;
signed main() {
#pragma warning(disable : 4996)
  int n, m;
  cin >> n >> m;
  vector<pair<pair<int, int>, vector<int> > > v(n);
  int sum = 0;
  for (int i = 0; i < n; i++) {
    int k;
    cin >> k;
    sum += k;
    v[i].first.first = k;
    v[i].first.second = i;
    v[i].second.resize(k);
    for (int j = 0; j < k; j++) {
      cin >> v[i].second[j];
    }
  }
  vector<int> f(n);
  for (int i = 0; i < n; i++) {
    if (i < sum % n) {
      f[i] = sum / n + 1;
    } else {
      f[i] = sum / n;
    }
  }
  sort(v.rbegin(), v.rend());
  vector<unordered_set<int> > st(n);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < v[i].second.size(); j++) {
      st[i].insert(v[i].second[j]);
    }
  }
  int l = 0, r = n - 1;
  vector<pair<pair<int, int>, int> > ans;
  while (l < r) {
    if (v[l].first.first == f[l]) {
      l++;
      continue;
    }
    if (v[r].first.first == f[r]) {
      r--;
      continue;
    }
    vector<int> del;
    for (int it : st[l]) {
      if (!st[r].count(it)) {
        ans.push_back(make_pair(
            make_pair(v[l].first.second + 1, v[r].first.second + 1), it));
        del.push_back(it);
        st[r].insert(it);
        v[l].first.first--;
        v[r].first.first++;
        if (v[l].first.first == f[l]) {
          l++;
          break;
          ;
        } else if (v[r].first.first == f[r]) {
          r--;
          break;
        }
      }
    }
    for (int i : del) {
      st[l].erase(i);
    }
  }
  cout << ans.size() << "\n";
  for (int i = 0; i < ans.size(); i++) {
    cout << ans[i].first.first << " " << ans[i].first.second << " "
         << ans[i].second << "\n";
  }
  return 0;
}
