#include <bits/stdc++.h>
using namespace std;
const long long int INF = 1000000000;
vector<long long int> sieve(vector<bool>& isprime) {
  auto N = isprime.size() - 1;
  fill((isprime).begin(), (isprime).end(), true);
  isprime[0] = isprime[1] = false;
  for (unsigned long long int i = 2; i * i <= N; ++i)
    if (isprime[i])
      for (unsigned long long int j = i * i; j <= N; j += i) isprime[j] = false;
  vector<long long int> primes;
  for (long long int i = (0); (i) < (long long int)(N + 1); ++(i))
    if (isprime[i]) primes.push_back(i);
  return primes;
}
class amGraph : public vector<vector<long long int> > {
 public:
  amGraph(long long int s, long long int val = INF)
      : vector<vector<long long int> >(s, vector<long long int>(s, val)) {}
  void addEdge(long long int src, long long int dst, long long int c) {
    (*this)[src][dst] = c;
  }
};
struct edge {
  long long int fr, to, c;
  bool operator<(const edge& e) const {
    if (c != e.c) return (c < e.c);
    if (fr != e.fr) return (fr < e.fr);
    return (to < e.to);
  }
  bool operator==(const edge& e) const { return !(*this < e || e < *this); }
  bool operator>(const edge& e) const { return !(*this < e || *this == e); }
};
class alGraph : public vector<deque<edge> > {
 public:
  alGraph(long long int s) : vector<deque<edge> >(s) {}
  void addEdge(long long int src, long long int dst, long long int c = 0) {
    (*this)[src].push_back({src, dst, c});
  }
};
class elGraph : public deque<edge> {
 public:
  long long int n;
  elGraph(long long int s) : deque<edge>() { n = s; }
  void addEdge(long long int src, long long int dst, long long int c) {
    this->push_back({src, dst, c});
  }
};
int main() {
  long long int N, M;
  cin >> N >> M;
  vector<bool> vbool(100005);
  vector<long long int> primes = sieve(vbool);
  const long long int p = *lower_bound(primes.begin(), primes.end(), N - 1);
  vector<edge> edges(M);
  {
    long long int w12 = p - N + 2;
    edges[0] = edge({1, 2, w12});
    for (long long int i = (1); (i) < (long long int)(N - 1); ++(i))
      edges[i] = edge({i + 1, i + 2, 1});
    long long int counter = (N - 2) + 1;
    for (long long int u = (0); (u) < (long long int)(N); ++(u)) {
      if (counter >= (long long int)edges.size()) break;
      for (long long int v = (u + 2); (v) < (long long int)(N); ++(v)) {
        if (counter >= (long long int)edges.size()) break;
        edges[counter++] = edge({u + 1, v + 1, p + 1});
      }
    }
  }
  cout << p << " " << p << endl;
  for (const auto& e : edges) cout << e.fr << " " << e.to << " " << e.c << endl;
  return 0;
}
