#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void read(T &num) {
  num = 0;
  bool f = true;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = false;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    num = num * 10 + ch - '0';
    ch = getchar();
  }
  num = f ? num : -num;
}
int out[100];
template <class T>
inline void write(T x, char ch) {
  if (x == 0) {
    putchar('0');
    putchar(ch);
    return;
  }
  if (x < 0) {
    putchar('-');
    x = -x;
  }
  int num = 0;
  while (x) {
    out[num++] = (x % 10);
    x = x / 10;
  }
  for (int i = (num - 1); i >= (0); i--) putchar(out[i] + '0');
  putchar(ch);
}
struct point {
  int x, y;
} a[110005];
int tot;
int Y[110005];
int root[110005];
int ls[110005 * 31], rs[110005 * 31], sum[110005 * 31];
int s[4][4];
int n, m;
void pushup(int node) { sum[node] = sum[ls[node]] + sum[rs[node]]; }
void ins(int &p, int p1, int l, int r, int x) {
  p = ++tot;
  if (l == r) {
    sum[p] = sum[p1] + 1;
    return;
  }
  int mid = ((long long)l + r) / 2;
  if (x <= mid) {
    ins(ls[p], ls[p1], l, mid, x);
    rs[p] = rs[p1];
  } else {
    ins(rs[p], rs[p1], mid + 1, r, x);
    ls[p] = ls[p1];
  }
  pushup(p);
}
int v[110005], bo[110005];
int b[4][4];
int query(int p, int l, int r, int x, int y) {
  if (!p) return 0;
  if (x <= l && y >= r) return sum[p];
  int mid = ((long long)l + r) / 2;
  int ans = 0;
  if (x <= mid) ans += query(ls[p], l, mid, x, y);
  if (y > mid) ans += query(rs[p], mid + 1, r, x, y);
  return ans;
}
void dfs(int x, int y) {
  if (y == 4) {
    dfs(x + 1, 1);
    return;
  }
  if (x == 4) {
    for (int i = (1); i <= (3); i++)
      for (int j = (1); j <= (3); j++)
        s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + b[i][j];
    int sx[3] = {s[3][1], s[3][2], s[3][3]},
        sy[3] = {Y[s[1][3]], Y[s[2][3]], Y[s[3][3]]};
    if (a[sx[0]].x == a[sx[0] + 1].x || a[sx[1]].x == a[sx[1] + 1].x) return;
    for (int i = (0); i <= (2); i++)
      for (int j = (0); j <= (2); j++)
        if (query(root[sx[j]], 0, 2 * 1000000000, 0, sy[i]) != s[i + 1][j + 1])
          return;
    printf("%.10lf %.10lf\n%.10lf %.10lf\n", a[sx[0]].x + 0.1, a[sx[1]].x + 0.1,
           sy[0] + 0.5 - 1000000000, sy[1] + 0.7 - 1000000000);
    exit(0);
  }
  for (int i = (1); i <= (9); i++)
    if (!bo[i]) {
      b[x][y] = v[i];
      bo[i] = 1;
      dfs(x, y + 1);
      bo[i] = 0;
    }
}
int main() {
  read(n);
  for (int i = (1); i <= (n); i++) {
    read(a[i].x);
    read(a[i].y);
    a[i].y += 1000000000;
  }
  sort(a + 1, a + n + 1,
       [](const point &a, const point &b) { return a.y < b.y; });
  for (int i = (1); i <= (n); i++) Y[i] = a[i].y;
  sort(a + 1, a + n + 1,
       [](const point &a, const point &b) { return a.x < b.x; });
  for (int i = (1); i <= (n); i++) {
    ins(root[i], root[i - 1], 0, 2 * 1000000000, a[i].y);
  }
  for (int i = (1); i <= (9); i++) read(v[i]);
  memset(bo, 0, sizeof(bo));
  dfs(1, 1);
  puts("-1");
  return 0;
}
