import std.conv, std.functional, std.range, std.stdio, std.string;
import std.algorithm, std.array, std.bigint, std.bitmanip, std.complex, std.container, std.math, std.mathspecial, std.numeric, std.regex, std.typecons;
import core.bitop;

class EOFException : Throwable { this() { super("EOF"); } }
string[] tokens;
string readToken() { for (; tokens.empty; ) { if (stdin.eof) { throw new EOFException; } tokens = readln.split; } auto token = tokens.front; tokens.popFront; return token; }
int readInt() { return readToken.to!int; }
long readLong() { return readToken.to!long; }
real readReal() { return readToken.to!real; }

bool chmin(T)(ref T t, in T f) { if (t > f) { t = f; return true; } else { return false; } }
bool chmax(T)(ref T t, in T f) { if (t < f) { t = f; return true; } else { return false; } }

int binarySearch(alias pred, T)(in T[] as) { int lo = -1, hi = cast(int)(as.length); for (; lo + 1 < hi; ) { const mid = (lo + hi) >> 1; (unaryFun!pred(as[mid]) ? hi : lo) = mid; } return hi; }
int lowerBound(T)(in T[] as, T val) { return as.binarySearch!(a => (a >= val)); }
int upperBound(T)(in T[] as, T val) { return as.binarySearch!(a => (a > val)); }




void main() {
  enum MAX_N = 8;
  auto dp = new int[][MAX_N + 1];
  dp[1] = [0];
  foreach (m; 2 .. MAX_N + 1) {
    dp[m] ~= (m - 1) << 1;
    foreach (z; dp[m - 1]) {
      dp[m] ~= z;
    }
    dp[m] ~= (m - 1) << 1 | 1;
    foreach_reverse (z; dp[m - 1]) {
      dp[m] ~= z ^ 1;
    }
  }
  debug {
    foreach (m; 1 .. MAX_N + 1) {
      writefln("dp[%s] = %s", m, dp[m].map!(z => format("%s%s", "+-"[z & 1], z >> 1)));
    }
    writeln(dp.map!(seq => seq.length));
  }
  
  try {
    for (; ; ) {
      const N = readInt();
      const A = readToken();
      
      const B = A.map!"a == '1'".array;
      
      bool valid = true;
      foreach (p; 0 .. 1 << N) {
        foreach (u; 0 .. N) {
          if (!(p & 1 << u)) {
            if (!B[p] && B[p | 1 << u]) {
              valid = false;
            }
          }
        }
      }
      if (valid) {
        int[] seq;
        foreach (p; 1 .. 1 << N) {
          if (!B[p]) {
            bool maximal = true;
            foreach (u; 0 .. N) {
              if (p & 1 << u) {
                if (!B[p ^ 1 << u]) {
                  maximal = false;
                }
              }
            }
            if (maximal) {
              debug {
                writeln("maximal p = ", p);
              }
              int[] us;
              foreach (u; 0 .. N) {
                if (p & 1 << u) {
                  us ~= u;
                }
              }
              foreach (z; dp[us.length]) {
                seq ~= us[z >> 1] << 1 | (z & 1);
              }
            }
          }
        }
        debug {
          writeln(seq.map!(z => format("%s%s", "+-"[z & 1], z >> 1)));
        }
        
        debug {
          foreach (p; 0 .. 1 << N) {
            DList!int stack;
            foreach (z; seq) {
              if (p & 1 << (z >> 1)) {
                if (!stack.empty && (stack.back ^ z) == 1) {
                  stack.removeBack;
                } else {
                  stack ~= z;
                }
              }
            }
            assert(B[p] == stack.empty);
          }
        }
        
        alias Pt = Tuple!(int, "x", int, "y");
        Pt[] ps;
        ps ~= Pt(0, 0);
        int x = 0;
        foreach (z; seq) {
          for (; x < (z >> 1); ) ps ~= Pt(++x, 0);
          for (; x > (z >> 1); ) ps ~= Pt(--x, 0);
          if (z & 1) {
            ps ~= Pt(x, 1);
            ps ~= Pt(x + 1, 1);
            ps ~= Pt(x + 1, 0);
            ps ~= Pt(x, 0);
          } else {
            ps ~= Pt(x + 1, 0);
            ps ~= Pt(x + 1, 1);
            ps ~= Pt(x, 1);
            ps ~= Pt(x, 0);
          }
        }
        for (; 0 < x; ) ps ~= Pt(--x, 0);
        stderr.writeln("L = ", cast(int)(ps.length) - 1);
        writeln("Possible");
        writeln(cast(int)(ps.length) - 1);
        foreach (ref p; ps) {
          writeln(p.x, " ", p.y);
        }
      } else {
        writeln("Impossible");
      }
    }
  } catch (EOFException e) {
  }
}
