#include <bits/stdc++.h>
using namespace std;
int main() {
  int n, m;
  scanf("%d %d", &n, &m);
  int E = m;
  int div[n + 1];
  int prime[n + 1];
  memset(prime, 0, sizeof prime);
  memset(div, 0, sizeof div);
  vector<int> edge[n + 1];
  for (int i = 2; i <= n; i++) {
    if (prime[i] == 0) {
      for (int j = i + i; j <= n; j += i) {
        edge[i].push_back(j);
        div[j] = i;
        prime[j] = true;
      }
    }
  }
  vector<pair<int, int>> ans;
  for (int i = 1; i <= n; i++) {
    int ant = i;
    while (m) {
      int aux = i;
      int nn = n + 1;
      while (prime[aux]) {
        auto p = upper_bound(edge[div[aux]].begin(), edge[div[aux]].end(), ant);
        if (p != edge[div[aux]].end()) {
          nn = min(nn, *p);
        }
        aux = aux / div[aux];
      }
      auto p = upper_bound(edge[aux].begin(), edge[aux].end(), ant);
      if (p != edge[aux].end()) {
        nn = min(nn, *p);
      }
      if (nn == n + 1) break;
      for (int k = ant + 1; k < nn && m; k++) {
        ans.push_back({i, k});
        m--;
      }
      ant = nn;
    }
    ant++;
    while (ant <= n && m) {
      ans.push_back({i, ant});
      m--;
      ant++;
    }
  }
  if (m || (E < n - 1)) {
    printf("Impossible");
  } else {
    printf("Possible\n");
    for (auto x : ans) {
      printf("%d %d\n", x.first, x.second);
    }
  }
  return 0;
}
