#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 2e5 + 5;
int n, m;
int a[N], sum;
int take[N], want[N];
set<int> s[N];
vector<pair<pair<int, int>, int> > ans;
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    int sz;
    cin >> sz;
    for (int j = 1; j <= sz; j++) {
      int x;
      cin >> x;
      s[i].insert(x);
    }
    a[i] = i;
    sum += sz;
  }
  sort(a + 1, a + 1 + n,
       [](int x, int y) { return s[x].size() < s[y].size(); });
  for (int i = 1; i <= n; i++) {
    if (i < n - (sum % n) + 1) {
      want[i] = sum / n;
    } else {
      want[i] = sum / n + 1;
    }
  }
  int L = 1, R = n;
  while (L < R) {
    if (want[L] == (int)s[a[L]].size()) {
      L++;
      continue;
    }
    if (want[R] == (int)s[a[R]].size()) {
      R--;
      continue;
    }
    if (take[L] == 0) {
      int need =
          min(want[L] - (int)s[a[L]].size(), (int)s[a[R]].size() - want[R]);
      vector<int> give;
      if (s[a[L]].size() == 0) {
        while ((int)give.size() < need) {
          auto it = s[a[R]].begin();
          give.push_back(*it);
          s[a[R]].erase(it);
        }
      } else {
        while ((int)give.size() < need && *s[a[R]].begin() < *s[a[L]].begin()) {
          give.push_back(*s[a[R]].begin());
          s[a[R]].erase(s[a[R]].begin());
        }
        for (int i : s[a[L]]) {
          if ((int)give.size() == need) break;
          auto it = s[a[L]].find(i);
          it++;
          int val = (it != s[a[L]].end() ? *it : 1e9);
          while (1) {
            if ((int)give.size() == need) break;
            auto it1 = s[a[R]].upper_bound(i);
            if (it1 == s[a[R]].end()) break;
            if (*it1 >= val) break;
            give.push_back(*it1);
            s[a[R]].erase(it1);
          }
        }
      }
      for (int i : give) {
        ans.push_back({{a[R], a[L]}, i});
        s[a[L]].insert(i);
      }
      take[L] = 1;
    } else {
      int need =
          min(want[L] - (int)s[a[L]].size(), (int)s[a[R]].size() - want[R]);
      vector<int> give;
      for (int i : s[a[R]]) {
        if ((int)give.size() == need) break;
        if (s[a[L]].find(i) == s[a[L]].end()) {
          give.push_back(i);
        }
      }
      for (int i : give) {
        ans.push_back({{a[R], a[L]}, i});
        s[a[R]].erase(i);
        s[a[L]].insert(i);
      }
      take[R] = 1;
    }
  }
  cout << (int)ans.size() << "\n";
  for (auto i : ans) {
    cout << i.first.first << " " << i.first.second << " " << i.second << "\n";
  }
}
