#include <bits/stdc++.h>
using namespace std;
const int N = 260;
vector<int> vec[10];
vector<int> e[N];
int CT[N], q[N], vis[N], a[N], b[N];
int qq[10], spe[10], out[10], n;
void work() {
  memset(vis, 0, sizeof(vis));
  memset(out, 0, sizeof(out));
  for (int i = (int)(1); i <= (int)(n); i++) CT[i] = 1;
  for (int i = (int)(0); i <= (int)(n); i++) e[i].resize(0);
  for (int i = (int)(1); i <= (int)(3); i++) CT[spe[i]] = 0;
  int h = 0, t = 1;
  q[1] = vis[1] = 1;
  while (h != t) {
    int x = q[++h];
    int v = (CT[x] ? a[x] & b[x] : a[x]);
    if (!out[v]) out[v] = x;
    for (int i = (int)(1); i <= (int)(n); i++)
      if (a[i])
        if (out[a[i]] && !vis[i] && CT[i]) {
          e[i].push_back(out[a[i]]);
          vis[i] = 1;
          q[++t] = i;
        }
    if (out[1] && out[2] && spe[1] && !vis[spe[1]]) {
      e[spe[1]].push_back(out[1]);
      e[spe[1]].push_back(out[2]);
      q[++t] = spe[1];
      vis[spe[1]] = 1;
    }
    if (out[1] && out[4] && spe[2] && !vis[spe[2]]) {
      e[spe[2]].push_back(out[1]);
      e[spe[2]].push_back(out[4]);
      q[++t] = spe[2];
      vis[spe[2]] = 1;
    }
    if (out[2] && out[4] && spe[3] && !vis[spe[3]]) {
      e[spe[3]].push_back(out[2]);
      e[spe[3]].push_back(out[4]);
      q[++t] = spe[3];
      vis[spe[3]] = 1;
    }
  }
  for (int i = (int)(1); i <= (int)(n); i++)
    if (a[i] && !vis[i]) return;
  puts("Possible");
  int sumi = 0;
  for (int i = (int)(1); i <= (int)(n); i++) {
    sumi += e[i].size();
    printf("%d ", CT[i]);
  }
  puts("");
  printf("%d\n", sumi);
  for (int i = (int)(1); i <= (int)(n); i++)
    for (int j = (int)(0); j <= (int)(e[i].size() - 1); j++)
      printf("%d %d\n", e[i][j], i);
  exit(0);
}
void dfs(int x) {
  if (x == 4) return work();
  dfs(x + 1);
  if (!vec[qq[x]].size()) return;
  spe[x] = vec[qq[x]].back();
  vec[qq[x]].pop_back();
  dfs(x + 1);
  vec[qq[x]].push_back(spe[x]);
  spe[x] = 0;
}
void read(int &x) {
  int y;
  for (int i = (int)(1); i <= (int)(3); i++) scanf("%d", &y), x = x * 2 + y;
}
int main() {
  scanf("%d", &n);
  for (int i = (int)(1); i <= (int)(n); i++) read(a[i]);
  for (int i = (int)(1); i <= (int)(n); i++) read(b[i]), vec[a[i]].push_back(i);
  qq[1] = 3;
  qq[2] = 5;
  qq[3] = 6;
  dfs(1);
  puts("Impossible");
}
