#include <bits/stdc++.h>
using namespace std;
using LL = long long;
void err() { cout << endl; }
template <template <typename...> class T, typename t, typename... Args>
void err(T<t> a, Args... args) {
  for (auto x : a) cout << x << ' ';
  err(args...);
}
template <typename T, typename... Args>
void err(T a, Args... args) {
  cout << a << ' ';
  err(args...);
}
struct P {
  int a, b, item;
};
const int N = 1E5 + 100;
int n, m, dm[N];
set<int> S[N];
int orders[N];
int main() {
  cin >> n >> m;
  int tot = 0;
  for (decay<decltype(n + 1)>::type i = (1), _i = (n + 1); i < _i; ++i) {
    int sz;
    scanf("%d", &sz);
    for (decay<decltype(sz)>::type j = (0), _j = (sz); j < _j; ++j) {
      int x;
      scanf("%d", &x);
      S[i].insert(x);
    }
    tot += sz;
  }
  for (decay<decltype(n + 1)>::type i = (1), _i = (n + 1); i < _i; ++i)
    orders[i] = i;
  sort(orders + 1, orders + n + 1,
       [](const int& x, const int& y) { return S[x].size() > S[y].size(); });
  int ll = 1, rr = n;
  int at_least = tot / n;
  for (decay<decltype(n + 1)>::type i = (1), _i = (n + 1); i < _i; ++i) {
    if (i <= tot % n)
      dm[orders[i]] = at_least + 1;
    else
      dm[orders[i]] = at_least;
  }
  vector<P> gather;
  while (ll < rr) {
    vector<P> adds;
    int rrrrrrrrr = orders[rr], lllllllll = orders[ll];
    ;
    if (int((S[rrrrrrrrr]).size()) >= dm[rrrrrrrrr] &&
        int((S[lllllllll]).size()) <= dm[lllllllll])
      break;
    vector<set<int>::iterator> vs;
    vs.push_back(S[lllllllll].begin());
    for (int v : S[rrrrrrrrr]) {
      auto it = S[lllllllll].upper_bound(v);
      if (it != S[lllllllll].end()) vs.push_back(it);
    }
    vector<int> dec;
    for (auto it : vs)
      while (int((S[lllllllll]).size()) - int((dec).size()) > dm[lllllllll] &&
             int((S[rrrrrrrrr]).size()) < dm[rrrrrrrrr] &&
             S[rrrrrrrrr].find(*it) == S[rrrrrrrrr].end()) {
        S[rrrrrrrrr].insert(*it);
        dec.push_back(*it++);
      }
    for (int v : dec) {
      S[lllllllll].erase(v);
      gather.push_back({lllllllll, rrrrrrrrr, v});
    };
    if (int((S[lllllllll]).size()) == dm[lllllllll]) ll++;
    if (int((S[rrrrrrrrr]).size()) == dm[rrrrrrrrr]) rr--;
  }
  cout << gather.size() << endl;
  for (decay<decltype(gather.size())>::type i = (0), _i = (gather.size());
       i < _i; ++i)
    printf("%d %d %d\n", gather[i].a, gather[i].b, gather[i].item);
}
