#include <bits/stdc++.h>
using namespace std;
const int inf = (int)1e9;
const long long linf = LLONG_MAX;
const int mod = 1000000007;
const double EPS = 1e-9;
inline int sign(long long val) { return val > 0 ? 1 : val == 0 ? 0 : -1; }
inline int add(int a, int b) { return a + b >= mod ? a + b - mod : a + b; }
inline int sub(int a, int b) { return a - b < 0 ? a - b + mod : a - b; }
inline int mul(int a, int b) { return int(a * 1ll * b % mod); }
bool eq(long double A, long double B) { return abs(A - B) < EPS; }
bool ls(long double A, long double B) { return A < B && !eq(A, B); }
bool le(long double A, long double B) { return A < B || eq(A, B); }
int feature_to_number(int f1, int f2, int f3) {
  int v = 0;
  if (f3 == 1) {
    v |= 1;
  }
  if (f2 == 1) {
    v |= 2;
  }
  if (f1 == 1) {
    v |= 4;
  }
  return v;
}
const int MAX_GROUPS = 8;
int main() {
  int n;
  cin >> n;
  vector<vector<int>> group_to_index(MAX_GROUPS, vector<int>());
  vector<int> index_to_group(n + 1);
  int j1, j2, j3;
  for (int i = 1; i <= n; i++) {
    cin >> j1 >> j2 >> j3;
    group_to_index[feature_to_number(j1, j2, j3)].push_back(i);
    index_to_group[i] = feature_to_number(j1, j2, j3);
  }
  vector<int> edges(n + 1);
  int t1, t2, t3;
  for (int i = 1; i <= n; i++) {
    cin >> t1 >> t2 >> t3;
    edges[i] = feature_to_number(t1, t2, t3);
  }
  queue<int> q;
  vector<bool> used(n + 1, false);
  q.push(1);
  used[1] = true;
  int used_count = 1;
  vector<bool> enable_tests(n + 1, false);
  vector<pair<int, int>> cd;
  while (true) {
    while (!q.empty()) {
      int v = q.front();
      q.pop();
      for (int i = 1; i <= n; i++) {
        if (i == v) {
          continue;
        }
        if (index_to_group[i] == index_to_group[v] && !used[i]) {
          used[i] = true;
          used_count++;
          q.push(i);
          cd.emplace_back(v, i);
          enable_tests[i] = true;
          index_to_group[i] &= edges[i];
        }
      }
    }
    bool found = false;
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= n; j++) {
        if (!used[i] || !used[j]) {
          continue;
        }
        for (int k = 1; k <= n; k++) {
          if (i == k || j == k) {
            continue;
          }
          if ((index_to_group[i] | index_to_group[j]) == index_to_group[k] &&
              !used[k]) {
            used[k] = true;
            used_count++;
            q.push(k);
            cd.emplace_back(i, k);
            cd.emplace_back(j, k);
            found = true;
            break;
          }
        }
        if (found) {
          break;
        }
      }
      if (found) {
        break;
      }
    }
    if (!found) {
      break;
    }
  }
  if (used_count != n) {
    cout << "Impossible" << endl;
    return 0;
  }
  cout << "Possible" << endl;
  for (int i = 1; i <= n; i++) {
    if (enable_tests[i]) {
      cout << 1 << ' ';
    } else {
      cout << 0 << ' ';
    }
  }
  cout << endl;
  cout << cd.size() << endl;
  for (auto p : cd) {
    cout << p.first << ' ' << p.second << endl;
  }
  return 0;
}
