#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
set<int> g[N];
vector<vector<int> > ans;
vector<pair<int, int> > B;
int n, m, total = 0, mn, need[N];
void mer(int a, int b, int v0, int v1) {
  vector<int> rem;
  auto it0 = g[a].begin(), it1 = g[b].begin();
  while (int((rem).size()) + int((g[a]).size()) < v0 &&
         int((g[b]).size()) - int((rem).size()) > v1) {
    if (it0 == g[a].end())
      rem.push_back(*it1), it1 = next(it1);
    else {
      if (*it0 == *it1)
        it0 = next(it0), it1 = next(it1);
      else if (*it0 < *it1)
        it0 = next(it0);
      else
        rem.push_back(*it1), it1 = next(it1);
    }
  }
  for (int v : rem) g[a].insert(v), g[b].erase(v), ans.push_back({b, a, v});
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  set<pair<int, int> > vs;
  for (int x = (0), qwerty = (n); x < qwerty; x++) {
    int s;
    cin >> s;
    total += s;
    for (int _ = (0), qwerty = (s); _ < qwerty; _++) {
      int v;
      cin >> v;
      g[x].insert(v);
    }
    vs.insert({s, x});
    B.push_back({s, x});
  }
  sort((B).begin(), (B).end());
  reverse((B).begin(), (B).end());
  mn = total / n;
  fill(need, need + n, mn);
  for (int x = (0), qwerty = (total % n); x < qwerty; x++) need[B[x].second]++;
  while (int((vs).size())) {
    int u = vs.begin()->second, v = vs.rbegin()->second;
    vs.erase({int((g[u]).size()), u});
    vs.erase({int((g[v]).size()), v});
    mer(u, v, need[u], need[v]);
    if (int((g[u]).size()) != need[u]) vs.insert({int((g[u]).size()), u});
    if (int((g[v]).size()) != need[v]) vs.insert({int((g[v]).size()), v});
  }
  cout << int((ans).size()) << "\n";
  for (auto v : ans) cout << v[0] + 1 << " " << v[1] + 1 << " " << v[2] << "\n";
}
