import std.stdio, std.array, std.string, std.conv, std.algorithm;
import std.typecons, std.range, std.random, std.math, std.container;
import std.numeric, std.bigint, core.bitop, std.bitmanip;

void main() {
    auto s = readln.split.map!(to!int);
    auto N = s[0];
    auto M = s[1];

    if (M < N - 1) {
        writeln("Impossible");
        return;
    }

    auto X = new int[][](N+1);
    auto Y = new int[][](N+1);

    foreach (i; 2..N+1) {
        if (!X[i].empty) continue;
        for (int j = i; j <= N; j += i) {
            X[j] ~= i;
            Y[i] ~= j;
        }
    }

    int cnt = 0;
    auto ans = new Tuple!(int, int)[](M);

    foreach (i; 2..N+1) {
        ans[cnt] = tuple(1, i);
        cnt += 1;
    }

    for (int i = N - (1 - N%2); i > 2 && cnt < M; i -= 2) {
        auto tmp = new bool[](i);
        foreach (j; X[i]) foreach (k; Y[j]) if (k < i) tmp[k] = true;
        for (int j = 2; j < i && cnt < M; ++j) if (!tmp[j]) ans[cnt] = tuple(j, i), cnt++;
    }
    for (int i = N - N%2; i > 1 && cnt < M; i -= 2) {
        auto tmp = new bool[](i);
        foreach (j; X[i]) foreach (k; Y[j]) if (k < i) tmp[k] = true;
        for (int j = 2; j < i && cnt < M; ++j) if (!tmp[j]) ans[cnt] = tuple(j, i), cnt++;
    }

    if (cnt == M) {
        writeln("Possible");
        ans.each!(a => writeln(a[0], " ", a[1]));
    } else {
        writeln("Impossible");
    }
}
