#include <bits/stdc++.h>   using namespace std;   inline int Get() {     int res = 0, q = 1;     char ch = getchar();     while ((ch <  0  || ch >  9 ) && ch !=  - ) ch = getchar();     if (ch ==  - ) q = -1, ch = getchar();     while (ch >=  0  && ch <=  9 ) res = res * 10 + ch -  0 , ch = getchar();     return res * q;   }   const double eps = 1e-12, pi = M_PI;   const int oo = (int)2e9, mod = (int)1e9 + 7;   const long long INF = (long long)1e17;   const int N = (int)1e5;   typedef int arr[N + 10];   arr a, b, c, lstx, lsty, id, u, v, sc;   bool vs[10];   int d[10], ord[10];   int n, m;   bool cmp_x(const int &x, const int &y) { return a[x] < a[y]; }   bool cmp_y(const int &x, const int &y) { return b[x] < b[y]; }   struct node {     node *ch[2];     int s;   } * Rt[N + 10];   node *New() {     node *res = new node;     res->ch[0] = res->ch[1] = NULL, res->s = 0;     return res;   }   node *Copy(node *x) {     node *res = new node;     res->ch[0] = x->ch[0], res->ch[1] = x->ch[1], res->s = x->s;     return res;   }   node *New(node *x, int d) {     if (!x->ch[d]) return New();     return Copy(x->ch[d]);   }   void Update(node *x) {     x->s = 0;     if (x->ch[0]) x->s += x->ch[0]->s;     if (x->ch[1]) x->s += x->ch[1]->s;   }   void Add(int l, int r, node *&x, int pos) {     if (l == r) {       ++x->s;       return;     }     int mid = (l + r) >> 1;     if (pos <= mid)       Add(l, mid, x->ch[0] = New(x, 0), pos);     else       Add(mid + 1, r, x->ch[1] = New(x, 1), pos);     Update(x);   }   int Query(int l, int r, node *x, int ml, int mr) {     if (!x || ml > mr) return 0;     if (l >= ml && r <= mr) return x->s;     int mid = (l + r) >> 1, res = 0;     if (ml <= mid) res += Query(l, mid, x->ch[0], ml, mr);     if (mr > mid) res += Query(mid + 1, r, x->ch[1], ml, mr);     return res;   }   void Init() {     scanf(          %d            n ,         &n);     for (int i = (1), end = (n); i <= end; ++i)       scanf(            %d             %d              n ,           a + i, b + i),           u[i] = a[i], v[i] = b[i], c[i] = a[i], lstx[i] = i, lsty[i] = i;     for (int i = (1), end = (9); i <= end; ++i) scanf( %d , d + i);     c[n + 1] = oo;     sort(c + 1, c + n + 1);     int cnt = 0;     for (int i = (1), end = (n); i <= end; ++i)       if (c[i] != c[i + 1]) c[++cnt] = c[i];     for (int i = (1), end = (n); i <= end; ++i)       a[i] = lower_bound(c + 1, c + cnt + 1, a[i]) - c;     for (int i = (1), end = (n); i <= end; ++i) c[i] = b[i];     sort(c + 1, c + n + 1);     cnt = 0;     for (int i = (1), end = (n); i <= end; ++i)       if (c[i] != c[i + 1]) c[++cnt] = c[i];     m = cnt;     for (int i = (1), end = (n); i <= end; ++i)       b[i] = lower_bound(c + 1, c + cnt + 1, b[i]) - c;     sort(lstx + 1, lstx + n + 1, cmp_x);     sort(lsty + 1, lsty + n + 1, cmp_y);     Rt[0] = New();     int tot = 0;     for (int i = (1), end = (n); i <= end; ++i) {       int x = lstx[i];       if (a[x] == a[lstx[i - 1]])         Rt[i] = Rt[sc[tot]], id[x] = tot;       else         Rt[i] = Copy(Rt[sc[tot]]), sc[++tot] = i, id[x] = tot;       Add(1, m, Rt[i], b[x]);     }   }   void Check() {     int x1 = lstx[ord[1] + ord[4] + ord[7]],         x2 = lstx[ord[1] + ord[2] + ord[4] + ord[5] + ord[7] + ord[8] + 1];     int y1 = lsty[ord[7] + ord[8] + ord[9]],         y2 = lsty[ord[7] + ord[8] + ord[9] + ord[4] + ord[5] + ord[6] + 1];     int num = Query(1, m, Rt[sc[id[x1]]], b[y2], m);     if (num != ord[1]) return;     num = Query(1, m, Rt[sc[id[x1]]], b[y1] + 1, b[y2] - 1);     if (num != ord[4]) return;     num = Query(1, m, Rt[sc[id[x1]]], 1, b[y1]);     if (num != ord[7]) return;     num = Query(1, m, Rt[sc[id[x2] - 1]], b[y2], m) - ord[1];     if (num != ord[2]) return;     num = Query(1, m, Rt[sc[id[x2] - 1]], 1, b[y1]) - ord[7];     if (num != ord[8]) return;     num = Query(1, m, Rt[n], b[y2], m) - ord[1] - ord[2];     if (num != ord[3]) return;     num = Query(1, m, Rt[n], 1, b[y1]) - ord[7] - ord[8];     if (num != ord[9]) return;     num = Query(1, m, Rt[n], b[y1] + 1, b[y2] - 1) -           Query(1, m, Rt[sc[id[x2] - 1]], b[y1] + 1, b[y2] - 1);     if (num != ord[6]) return;     double px1 = (double)u[x1] + 0.5, px2 = (double)u[x2] - 0.5;     double py1 = (double)v[y1] + 0.5, py2 = (double)v[y2] - 0.5;     printf(          %.8lf                       %.8lf            n ,         px1, px2);     printf(          %.8lf                       %.8lf            n ,         py1, py2);     exit(0);   }   void Dfs(int x) {     if (x > 9) {       Check();       return;     }     for (int i = (1), end = (9); i <= end; ++i)       if (!vs[i]) {         vs[i] = 1, ord[x] = d[i];         Dfs(x + 1);         vs[i] = 0;       }   }   int main() {     Init();     Dfs(1);     printf( -1 n );     return 0;   }