#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5;
const int P = 362880;
int n;
int x[maxn + 5], y[maxn + 5];
int id[10], c[10], d[10];
struct node {
  int x, y;
} a[maxn + 5];
int okx(int p) { return x[p] != x[p + 1]; }
int oky(int p) { return y[p] != y[p + 1]; }
vector<int> val[maxn * 4];
void build(int p, int l, int r) {
  for (int i = l; i <= r; i++) {
    val[p].push_back(a[i].y);
  }
  sort(val[p].begin(), val[p].end());
  if (l == r) return;
  int mid = (l + r) >> 1;
  build(p << 1, l, mid);
  build(p << 1 | 1, mid + 1, r);
}
int query(int p, int l, int r, int qx, int qy) {
  if (qx < a[l].x) return 0;
  if (qx >= a[r].x) {
    return upper_bound(val[p].begin(), val[p].end(), qy) - val[p].begin();
  }
  int mid = (l + r) >> 1;
  return query(p << 1, l, mid, qx, qy) + query(p << 1 | 1, mid + 1, r, qx, qy);
}
void check() {
  int x1 = d[1] + d[4] + d[7];
  int x2 = x1 + d[2] + d[5] + d[8];
  int y1 = d[1] + d[2] + d[3];
  int y2 = y1 + d[4] + d[5] + d[6];
  if (!okx(x1)) return;
  if (!okx(x2)) return;
  if (!oky(y1)) return;
  if (!oky(y2)) return;
  if (query(1, 1, n, x[x1], y[y1]) != d[1]) return;
  if (query(1, 1, n, x[x1], y[y2]) != d[1] + d[4]) return;
  if (query(1, 1, n, x[x2], y[y1]) != d[1] + d[2]) return;
  if (query(1, 1, n, x[x2], y[y2]) != d[1] + d[2] + d[4] + d[5]) return;
  printf("%.3f %.3f\n%.3f %.3f\n", x[x1] + 0.5, x[x2] + 0.5, y[y1] + 0.5,
         y[y2] + 0.5);
  exit(0);
}
int main() {
  cin >> n;
  for (int i = 1; i <= n; i++) {
    scanf("%d %d", &a[i].x, &a[i].y);
    x[i] = a[i].x, y[i] = a[i].y;
  }
  sort(a + 1, a + n + 1, [&](node x, node y) { return x.x < y.x; });
  sort(x + 1, x + n + 1);
  sort(y + 1, y + n + 1);
  for (int i = 1; i <= 9; i++) {
    cin >> c[i];
    id[i] = i;
  }
  build(1, 1, n);
  do {
    for (int i = 1; i <= 9; i++) {
      d[i] = c[id[i]];
    }
    check();
  } while (next_permutation(id + 1, id + 9 + 1));
  puts("-1");
  return 0;
}
