#include <bits/stdc++.h>   using namespace std;   const long long MOD = (1ll << 32);   const int LOGN = 14;   const long long INF = (1ll << 62);   long long __gcd(long long a, long long b) {     if (b == 0) return a;     return __gcd(b, a % b);   }   bool comp(pair<int, unordered_set<int> >& a,             pair<int, unordered_set<int> >& b) {     return a.second.size() > b.second.size();   }   int main() {     std ::ios_base ::sync_with_stdio(false);     cin.tie(NULL), cout.tie(NULL);     int n, m;     cin >> n >> m;     vector<pair<int, unordered_set<int> > > a(n);     int sz;     int ct = 0;     int ct_p1 = 0;     for (int i = 0; i < n; ++i) {       cin >> sz;       ct += sz;       a[i].first = i;       int x;       for (int j = 0; j < sz; ++j) {         cin >> x;         a[i].second.insert(x);       }     }     ct_p1 = ct % n;     ct /= n;     sort(a.begin(), a.end(), comp);     int l = 0;     int r = n - 1;     vector<vector<int> > ans;     while (l < r) {       int req_l_size = ct;       int req_r_size = ct;       if (l < ct_p1) req_l_size++;       if (r < ct_p1) req_r_size++;       vector<int> temp;       for (auto it : a[l].second) {         if ((int)a[l].second.size() - (int)temp.size() == req_l_size) break;         if (a[r].second.size() == req_r_size) break;         if (a[r].second.find(it) == a[r].second.end()) {           temp.push_back(it);           a[r].second.insert(it);           vector<int> x;           x.push_back(a[l].first);           x.push_back(a[r].first);           x.push_back(it);           ans.push_back(x);         }       }       for (int i = 0; i < temp.size(); ++i) a[l].second.erase(temp[i]);       if (a[r].second.size() == req_r_size) r--;       if (a[l].second.size() == req_l_size) l++;     }     cout << ans.size() << endl;     for (int i = 0; i < ans.size(); ++i)       cout << ans[i][0] + 1 <<     << ans[i][1] + 1 <<     << ans[i][2] << endl;     return 0;   }   