#include <bits/stdc++.h>
int tot, pos[100001], ans[500001][3], xi, yi, tp, s[100001], n, m, fir[100001],
    nex[1200001], sto[1200001], cnt, sum, si, pre[100001], c[500001], l[400001],
    r[400001], sz[400001];
void built(int num, int x, int y) {
  l[num] = x;
  r[num] = y;
  sz[num] = 0;
  if (x == y) return;
  int mid = (x + y) / 2;
  built(num * 2, x, mid);
  built(num * 2 + 1, mid + 1, y);
}
void gai(int num, int x) {
  if (l[num] == r[num]) {
    sz[num] = sz[num] ^ 1;
    return;
  }
  int mid = (l[num] + r[num]) / 2;
  if (x <= mid)
    gai(num * 2, x);
  else
    gai(num * 2 + 1, x);
  sz[num] = sz[num * 2] + sz[num * 2 + 1];
}
int ask(int num, int x, int y) {
  if (sz[num] == 0) return (-1);
  if (l[num] == r[num]) return (l[num]);
  if ((l[num] == x) && (r[num] == y)) {
    int answ = ask(num * 2, x, r[num * 2]);
    if (answ > 0)
      return (answ);
    else
      return (ask(num * 2 + 1, l[num * 2 + 1], y));
  }
  int mid = (l[num] + r[num]) / 2;
  if (y <= mid)
    return (ask(num * 2, x, y));
  else {
    if (x > mid)
      return (ask(num * 2 + 1, x, y));
    else {
      int answ = ask(num * 2, x, mid);
      if (answ > 0)
        return (answ);
      else
        return (ask(num * 2 + 1, mid + 1, y));
    }
  }
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++) {
    cnt++;
    nex[cnt] = fir[i];
    fir[i] = cnt;
    sto[cnt] = 0;
  }
  for (int i = 1; i <= n; i++) {
    scanf("%d", &s[i]);
    pre[i] = pre[i - 1] + s[i];
    sum = sum + s[i];
    for (int j = pre[i - 1] + 1; j <= pre[i]; j++) {
      cnt++;
      scanf("%d", &c[j]);
      nex[cnt] = fir[c[j]];
      fir[c[j]] = cnt;
      sto[cnt] = i;
    }
  }
  tp = sum / n;
  xi = sum % n;
  yi = tp + 1;
  if (xi == 0) {
    yi--;
    xi = n + 1;
  }
  for (int i = 1; i <= m; i++) {
    cnt++;
    nex[cnt] = fir[i];
    fir[i] = cnt;
    sto[cnt] = n + 1;
  }
  built(1, 1, n);
  for (int i = 1; i <= n; i++)
    if (s[i] >= yi) {
      xi--;
      pos[i] = yi;
      if (xi == 0) {
        yi--;
        xi = n + 1;
        break;
      }
    }
  for (int i = 1; i <= n; i++)
    if (pos[i] == 0) {
      pos[i] = yi;
      xi--;
      if (xi == 0) {
        yi--;
        xi = n + 1;
      }
    }
  for (int i = 1; i <= n; i++)
    if (pos[i] > s[i]) gai(1, i);
  tot = 0;
  for (int i = 1; i <= n; i++)
    if (s[i] > pos[i]) {
      for (int j = pre[i - 1] + 1; j <= pre[i]; j++) {
        if (s[i] == pos[i]) break;
        while (sto[fir[c[j]]] != 0) {
          int li = sto[fir[c[j]]], ri = sto[nex[fir[c[j]]]], aa = fir[c[j]],
              bb = nex[aa];
          if (li != (ri + 1)) {
            int hh = ask(1, ri + 1, li - 1);
            if (hh > 0) {
              tot++;
              ans[tot][0] = i;
              ans[tot][1] = hh;
              ans[tot][2] = c[j];
              s[hh]++;
              cnt++;
              sto[cnt] = hh;
              nex[aa] = cnt;
              nex[cnt] = bb;
              if ((s[hh] == pos[hh])) gai(1, hh);
              s[i]--;
              break;
            }
          }
          fir[c[j]] = nex[fir[c[j]]];
        }
      }
    }
  printf("%d\n", tot);
  for (int i = 1; i <= tot; i++)
    printf("%d %d %d\n", ans[i][0], ans[i][1], ans[i][2]);
}
