#include <bits/stdc++.h>   using namespace std;   const long long mod = 1e5 + 5;   const long long inf = -1;   const long long m = 1e6;   vector<long long> prime;   bool sieve[m + 2];   void primeSieve() {     memset(sieve, true, sizeof(sieve));     sieve[0] = sieve[1] = false;     prime.push_back(2);     for (long long i = 4; i <= m; i += 2) sieve[i] = false;     long long sqrtn = sqrt(m);     for (long long i = 3; i <= sqrtn; i += 2) {       if (sieve[i]) {         for (long long j = i * i; j <= m; j += 2 * i) sieve[j] = false;       }     }     for (long long i = 3; i <= m; i += 2)       if (sieve[i]) prime.push_back(i);   }   map<pair<long long, long long>, long long> use;   signed main() {     ios::sync_with_stdio(false);     cin.tie(0);     primeSieve();     long long n, m, i;     cin >> n >> m;     long long pos =         upper_bound(prime.begin(), prime.end(), n - 2) - prime.begin();     long long need = prime[pos] - (n - 2);     vector<pair<long long, pair<long long, long long>>> v;     long long x = 1;     for (i = 1; i < n; i++) {       if (i + 1 == n) x = need;       v.push_back(make_pair(i, make_pair(i + 1, x)));       use[make_pair(i, i + 1)] = 1;     }     long long sum = (n - 2) + need;     m -= (n - 1);     for (i = 1; i < n; i++) {       if (m == 0) break;       for (long long j = i + 1; j <= n; j++) {         if (m == 0) break;         if (!use[make_pair(i, j)] and m) {           v.push_back(make_pair(i, make_pair(j, mod)));           m--;           use[make_pair(i, j)] = 1;         }       }     }     cout << sum <<     << sum << endl;     for (auto p : v) {       cout << p.first <<     << (p.second).first <<     << (p.second).second            << endl;     }   }   