#include <bits/stdc++.h>
using namespace std;
const long double PI = acos(-1.0);
template <class T>
using min_queue = priority_queue<T, vector<T>, greater<T>>;
template <class T>
int sz(const T &first) {
  return (int)first.size();
}
template <class T>
ostream &operator<<(ostream &os, vector<T> v) {
  os << "\n[";
  for (T &first : v) os << first << ',';
  return os << "]\n";
}
struct pairhash {
 public:
  template <typename T1, typename T2>
  size_t operator()(const pair<T1, T2> &p) const {
    size_t lhs = hash<T1>()(p.first);
    size_t rhs = hash<T2>()(p.second);
    return lhs ^ (rhs + 0x9e3779b9 + (lhs << 6) + (lhs >> 2));
  }
};
vector<long long> per_feat[8], per_test[8][8];
bool run() {
  int n;
  cin >> n;
  vector<long long> feat(n), test(n);
  for (auto i = (0); i < (n); ++i) {
    int first, second, z;
    cin >> first >> second >> z;
    feat[i] = 4 * first + 2 * second + z;
  }
  for (auto i = (0); i < (n); ++i) {
    int first, second, z;
    cin >> first >> second >> z;
    test[i] = 4 * first + 2 * second + z;
    test[i] &= feat[i];
  }
  for (auto i = (0); i < (n); ++i) {
    per_feat[feat[i]].push_back(i);
    per_test[feat[i]][test[i]].push_back(i);
  }
  vector<bool> vis(8, false);
  vector<pair<long long, long long>> arcs;
  vector<long long> server(8, -1);
  vector<long long> comps;
  comps.push_back(7);
  server[7] = 0;
  vis[0] = true;
  vis[7] = true;
  vector<long long> ct(n, 0);
  for (int node : per_feat[7])
    if (node != 0) arcs.emplace_back(0, node);
  while (!comps.empty()) {
    int cur = comps.back();
    comps.pop_back();
    for (auto tst = (0); tst < (8); ++tst) {
      if (vis[tst]) continue;
      if (!per_test[cur][tst].empty()) {
        vis[tst] = true;
        comps.push_back(tst);
        server[tst] = per_test[cur][tst].back();
        ct[server[tst]] = 1;
        for (int node : per_feat[tst]) arcs.emplace_back(server[tst], node);
      }
    }
  }
  vector<long long> h1 = {1, 2, 4}, h2 = {3, 5, 6};
  for (int com : h2) {
    if (vis[com] || per_feat[com].empty()) continue;
    int c1 = com & (-com);
    int c2 = com - c1;
    if (!vis[c1] or !vis[c2]) return false;
    server[com] = per_feat[com].back();
    arcs.emplace_back(server[c1], server[com]);
    arcs.emplace_back(server[c2], server[com]);
    for (int node : per_feat[com])
      if (node != server[com]) arcs.emplace_back(server[com], node);
    vis[com] = true;
  }
  for (auto i = (0); i < (8); ++i) {
    if (!vis[i] and !per_feat[i].empty()) return false;
  }
  cout << "Possible" << endl;
  for (auto i = (0); i < (n); ++i) cout << (i == 0 ? "" : " ") << ct[i];
  cout << endl;
  cout << arcs.size() << endl;
  for (pair<long long, long long> e : arcs)
    cout << e.first + 1 << " " << 1 + e.second << endl;
  return true;
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout << fixed << setprecision(20);
  if (!run()) cout << "Impossible" << endl;
  return 0;
}
