using System;


    class Program
    {
        struct Pacijent
        {
            public string grupa;
            public int doza;
        }
        static int[,] uspesni;
        static bool O(int[] z, int i, Pacijent p)
        {
            if (p.doza > z[0]) return false;
            z[0] -= p.doza;
            uspesni[i, 0] += p.doza;
            return true;
        }
        static bool A_B(int[] z, int i, ref Pacijent p, int gr)
        {
            if (p.doza <= z[gr])
            {
                z[gr] -= p.doza;
                uspesni[i, gr] += p.doza;
                return true;
            }
            else
            {
                p.doza -= z[gr];
                uspesni[i, gr] += z[gr];
                z[gr] = 0;
                return false;
            }
        }
        static bool A_B_O(int[] z, int i, ref Pacijent p, string grupa)
        {
            if (grupa == "A") 
                if (A_B(z, i, ref p, 1)) return true;
            if (grupa == "B")
                if (A_B(z, i, ref p, 2)) return true;
            if (grupa == "AB")
                if (A_B(z, i, ref p, 3)) return true;

            if ((grupa == "A" || grupa == "B"))
                if (!O(z, i, p)) return false;
                else return true;
            // grupa = AB: ako nema zaliha za AB, proverava se da li ima za grupu A, pa za B, pa za O
            if (A_B(z, i, ref p, 1)) return true;
            if (A_B(z, i, ref p, 2)) return true;
            if (O(z, i, p)) return true;
            return false;
        }
        
        static bool Uspela_transfuzija(int[] z, Pacijent[] p)
        {
            for (int i = 0; i < p.Length; i++)
            {
                if (p[i].grupa == "O")
                {
                    if (!O(z, i, p[i])) return false;
                }
                else if (p[i].grupa == "A")
                {
                    if (!A_B_O(z, i, ref p[i], "A")) return false;
                }
                else if (p[i].grupa == "B")
                {
                    if (!A_B_O(z, i, ref p[i], "B")) return false;
                }
                else
                {
                    if (!A_B_O(z, i, ref p[i], "AB")) return false;
                }
            }
            return true;
        }
        static void Main(string[] args)
        {
            int n = int.Parse(Console.ReadLine());

            string[] zalihe_s = Console.ReadLine().Split();
            int[] zalihe = new int[4]; // 4 grupe
            for (int i = 0; i < zalihe.Length; i++)
                zalihe[i] = Convert.ToInt32(zalihe_s[i]);

            Pacijent[] pacijenti = new Pacijent[n];
            string[] p_s;
            for (int i = 0; i < pacijenti.Length; i++)
            {
                p_s = Console.ReadLine().Split();
                pacijenti[i].grupa = p_s[0];
                pacijenti[i].doza = Convert.ToInt32(p_s[1]);
            }
            uspesni = new int[n, 4];
            if (!Uspela_transfuzija(zalihe, pacijenti)) Console.WriteLine("nemoguce");
            else
            {
                Console.WriteLine("moguce");
                for (int i = 0; i < uspesni.GetLength(0); i++)
                {
                    for (int j = 0; j < uspesni.GetLength(1); j++)
                        Console.Write(uspesni[i, j] + " ");
                    Console.WriteLine();
                }
            }
        }
    }