#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;
  }
}
