using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace a
{
    class Program
    {
        static void ispisi(int[] a)
        {
            Console.WriteLine(a[0] + " " + a[1] + " " + a[2] + " " + a[3]);
        }
        static void poslednjeMoguceUzimanje(int l, ref int G, ref List<int[]> b, int j, ref bool nemoguce)
        //ime = ime grupe od koje se uzima, G = zalihe grupe, b niz ciji su clanovi osobe sa grupom G
        {
            for (int i = j; i < b.Count; i++)
            {
                int p = b[i][4];
                if (G < p)
                {
                    nemoguce = true;
                    break;
                }
                else
                {
                    G -= p;
                    b[i][l] = p;
                    b[i][4] = 0;
                }
            }
        }
        static void uzimanje(int l, ref int G, ref List<int[]> b, ref int j)
        {
            for (int i = j; G > 0 && i < b.Count; i++)
            {
                int p = b[i][4];
                if (G < p)
                {
                    b[i][l] = G;
                    p -= G;
                    G = 0;
                    b[i][4] = p;
                }
                else
                {
                    G -= p;
                    b[i][l] = p;
                    b[i][4] = 0;
                }
                j = i;//mora da bude van  ifa iznad zato sto ako
                      //se potrebe zadovolje samo iz grupe O onda ce se a izvrsiti opet ispocetka
            }
        }
        static void Main(string[] args)
        {
            int n = int.Parse(Console.ReadLine());
            string[] s = Console.ReadLine().Split();
            int Go = int.Parse(s[0]);
            int Ga = int.Parse(s[1]);
            int Gb = int.Parse(s[2]);
            int Gab = int.Parse(s[3]);
            List<int[]> o = new List<int[]>();//o se obradjuje jos pri unosu
            List<int[]> a = new List<int[]>();
            List<int[]> b = new List<int[]>();
            List<int[]> ab = new List<int[]>();//vec obradjeni
            List<int[]> ab0 = new List<int[]>();//za one koji nisu obradjeni ]][[
            int[] redosled = new int[n];
            bool nemoguce = false;
            for (int i = 0; i < n; i++)
            {
                int[] k = new int[5];//osoba, {0 0 0 0}= GRUPA IZ KOJE SE UZIMA 0=potrebno
                                     //i ako je jednako 0 znaci da ne treba da se dira ovo ti ostalo 0 kod o i ab zato sto je sve obradjeno
                string[] s1 = Console.ReadLine().Split();
                int p = int.Parse(s1[1]);//potrebno
                string grupa = s1[0];
                if (grupa == "O")
                {
                    if (Go < p)
                    {
                        nemoguce = true;
                        break;
                    }
                    Go -= p;
                    k[0] = p;
                    o.Add(k);
                    redosled[i] = 0;
                }
                else
                {
                    if (grupa == "A")
                    {
                        k[4] = p;
                        a.Add(k);
                        redosled[i] = 1;
                    }
                    else
                    {
                        if (grupa == "B")
                        {
                            k[4] = p;
                            b.Add(k);
                            redosled[i] = 2;
                        }
                        else
                        {
                            if (Gab > 0)//uzimanje grupe AB za potrebe AB
                            {
                                if (Gab < p)
                                {
                                    k[3] = Gab;
                                    p -= Gab;
                                    Gab = 0;
                                    k[4] = p;
                                    redosled[i] = 4;
                                    ab0.Add(k);
                                }
                                else
                                {
                                    Gab -= p;
                                    k[3] = p;
                                    ab.Add(k);
                                    redosled[i] = 3;//3 je broj za obradjene ab
                                }
                            }
                            else
                            {
                                k[4] = p;
                                ab0.Add(k);
                                redosled[i] = 4;
                            }
                        }
                    }
                }
            }
            if (nemoguce)
            {
                Console.WriteLine("nemoguce");
            }
            else
            {
                int j = 0;//da se ne bi duplo obilazila petlja
                uzimanje(1, ref Ga, ref a, ref j);
                poslednjeMoguceUzimanje(0, ref Go, ref a, j, ref nemoguce);
                if (nemoguce)
                {
                    Console.WriteLine("nemoguce");
                }
                else
                {
                    j = 0;
                    uzimanje(2, ref Gb, ref b, ref j);
                    poslednjeMoguceUzimanje(0, ref Go, ref b, j, ref nemoguce);
                    if (nemoguce)
                    {
                        Console.WriteLine("nemoguce");
                    }
                    else
                    {
                        j = 0;
                        uzimanje(0, ref Go, ref ab0, ref j);
                        uzimanje(1, ref Ga, ref ab0, ref j);
                        poslednjeMoguceUzimanje(2, ref Gb, ref ab0, j, ref nemoguce);
                        if (nemoguce)
                        {
                            Console.WriteLine("nemoguce");
                        }
                        else
                        {
                            List<int[]>[] x = new List<int[]>[] { o, a, b, ab, ab0 };
                            Console.WriteLine("moguce");
                            for (int i = 0; i < redosled.Length; i++)
                            {
                                ispisi(x[redosled[i]][0]);
                                x[redosled[i]].RemoveAt(0);
                            }
                        }
                    }
                }
            }
        }
    }
}