#include <bits/stdc++.h>
using namespace std;
vector<int> l[100009];
int cur[100009];
map<int, int> m1[100009];
vector<pair<int, pair<int, int> > > final;
vector<int> remover;
set<pair<int, int> > lol, lefter;
pair<int, int> temp1, temp2;
int main() {
  int i, j, t1, t2, t3, t4, n, m, ind1, ind2, val;
  bool rekt, founde;
  scanf("%d %d", &n, &m);
  for (i = 1; i <= n; i++) {
    scanf("%d", &t1);
    for (j = 0; j < t1; j++) {
      scanf("%d", &t2);
      l[i].push_back(t2);
      m1[i][t2]++;
      lefter.insert(make_pair(i, t2));
    }
    sort(l[i].begin(), l[i].end());
    cur[i] = 0;
    lol.insert(make_pair((int)l[i].size(), i));
  }
  if (n == 1) {
    printf("0\n");
    return 0;
  }
  while (1) {
    auto it = lol.begin();
    auto it2 = lol.end();
    it2--;
    t1 = abs(it->first - it2->first);
    if (t1 <= 1) {
      break;
    }
    remover.clear();
    ind1 = it2->second;
    ind2 = it->second;
    auto it3 = lefter.lower_bound(make_pair(ind1, -1));
    while (1) {
      t1 = it3->second;
      if (m1[ind2].find(t1) == m1[ind2].end()) {
        m1[ind1].erase(t1);
        m1[ind2][t1]++;
        final.push_back(make_pair(ind1, make_pair(ind2, t1)));
        lefter.erase(make_pair(ind1, t1));
        temp1 = *it;
        temp2 = *it2;
        lol.erase(it);
        lol.erase(it2);
        lol.insert(make_pair(temp1.first + 1, temp1.second));
        lol.insert(make_pair(temp2.first - 1, temp2.second));
        break;
      } else {
        remover.push_back(t1);
        it3++;
      }
    }
    for (auto it : remover) {
      lefter.erase(make_pair(ind1, it));
      lefter.erase(make_pair(ind2, it));
    }
  }
  printf("%d\n", (int) final.size());
  for (auto it : final) {
    printf("%d %d %d\n", it.first, it.second.first, it.second.second);
  }
  return 0;
}
