#include <bits/stdc++.h>
int GCD(int u, int v) {
  while (v != 0) {
    int r = u % v;
    u = v;
    v = r;
  }
  return u;
}
int main() {
  int amtV;
  int amtE;
  std::vector<std::pair<int, int>> graph;
  std::cin >> amtV >> amtE;
  int connected = 0;
  int remaining = amtE;
  if (amtE >= amtV - 1) {
    for (int i = 2; i <= amtV; i++) {
      graph.push_back(std::pair<int, int>(i, 1));
    }
    remaining = amtE - (amtV - 1);
    for (int i = 3; i <= amtV; i += 2) {
      if (remaining == 0) break;
      graph.push_back(std::pair<int, int>(i, 2));
      remaining--;
    }
    int currInd = 3;
    int currCompare;
    while (remaining > 0 && currInd < amtV) {
      currCompare = currInd + 1;
      while (remaining > 0 && currCompare <= amtV) {
        if (GCD(currInd, currCompare) == 1) {
          graph.push_back(std::pair<int, int>(currInd, currCompare));
          remaining--;
        }
        currCompare++;
      }
      currInd++;
    }
  }
  if (remaining == 0) {
    std::cout << "Possible" << std::endl;
    for (auto it = graph.begin(); it != graph.end(); it++) {
      std::cout << it->first << " " << it->second << std::endl;
    }
  } else {
    std::cout << "Impossible" << std::endl;
  }
  return 0;
}
