#include <bits/stdc++.h>
using namespace std;
int n, m, need[100005], tot, extra[100005];
vector<pair<int, set<int> > > ord;
set<int>::iterator it;
vector<pair<pair<int, int>, int> > ans;
bool cmp(pair<int, set<int> > a, pair<int, set<int> > b) {
  if ((int)a.second.size() > (int)b.second.size()) return true;
  return false;
}
int main() {
  ios_base::sync_with_stdio(false);
  int precision = numeric_limits<long double>::digits10;
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    pair<int, set<int> > temp;
    temp.first = i;
    int s;
    cin >> s;
    for (int j = 1; j <= s; j++) {
      int u;
      cin >> u;
      temp.second.insert(u);
      tot++;
    }
    ord.push_back(temp);
  }
  sort(ord.begin(), ord.end(), cmp);
  for (int i = 0; i <= n - 1; i++) {
    need[i] = tot / n;
    if (i < tot % n) need[i]++;
    extra[i] = (int)ord[i].second.size() - need[i];
  }
  int fw = 0, bw = n - 1;
  while (fw < bw) {
    if (extra[bw] == 0) {
      bw--;
      continue;
    }
    if (extra[fw] == 0) {
      fw++;
      continue;
    }
    vector<int> rem;
    for (it = ord[fw].second.begin(); it != ord[fw].second.end(); it++) {
      if (extra[fw] == 0 || extra[bw] == 0) break;
      if (ord[bw].second.find(*it) == ord[bw].second.end()) {
        extra[fw]--;
        extra[bw]++;
        rem.push_back(*it);
        ord[bw].second.insert(*it);
        ans.push_back(make_pair(make_pair(ord[fw].first, ord[bw].first), *it));
      }
    }
    for (int i = 0; i < (int)rem.size(); i++) ord[fw].second.erase(rem[i]);
  }
  cout << (int)ans.size() << endl;
  for (int i = 0; i < (int)ans.size(); i++)
    cout << ans[i].first.first << " " << ans[i].first.second << " "
         << ans[i].second << endl;
}
