using System;
using System.Collections.Generic;
using System.Linq;

namespace Zadatak_2
{
    class Funkcije
    {
        public static int[] ucitajNiz(string[] s)
        {
            int[] niz = new int[s.Length];
            for(int i = 0; i < s.Length; i++) {
                niz[i] = int.Parse(s[i]);
            }
            return niz;
        }

        public static void ispisiMatricu(List<List<int>> matrica)
        {
            for(int i = 0; i < matrica.Count; i++) {
                foreach(int element in matrica[i]) {
                    Console.Write(element + " ");
                }
                Console.WriteLine();
            }
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            //Korak 1 - ucitavamo podatke

            int n = int.Parse(Console.ReadLine());
            int[] zalihe = Funkcije.ucitajNiz(Console.ReadLine().Split());

            //Korak 2 - ucitavamo n pacijenta i krv koju trebaju da prime i da li je moguce to izvesti i ako jeste kako
            bool moguce = true;
            List<List<int>> primljenaKrv = new List<List<int>>(n);
            for(int i = 0; i < n & moguce; i++) {
                string[] unos = Console.ReadLine().Split();
                string grupa = unos[0];
                int kolicina = int.Parse(unos[1]);

                switch (grupa) {

                    case "O":
                        if (kolicina > zalihe[0]) {
                            moguce = false;
                            break;
                        }
                        else {
                            zalihe[0] -= kolicina;
                            List<int> pacijent = new List<int>(n){ kolicina, 0, 0, 0 };
                            primljenaKrv.Add(pacijent);
                            break;
                        }

                    case "A":
                        if (kolicina > zalihe[0] + zalihe[1]) {
                            moguce = false;
                            break;
                        }
                        else {
                            int A = zalihe[1];
                            int O = zalihe[0];
                            if (zalihe[1] < kolicina) {
                                kolicina -= zalihe[1];
                                zalihe[1] = 0;
                                zalihe[0] -= kolicina;
                            }
                            else {
                                zalihe[1] -= kolicina;
                            }
                            List<int> pacijent = new List<int>(n) { O - zalihe[0], A - zalihe[1], 0, 0 };
                            primljenaKrv.Add(pacijent);
                            break;
                        }

                    case "B":
                        if (kolicina > zalihe[0] + zalihe[2]) {
                            moguce = false;
                            break;
                        }
                        else {
                            int B = zalihe[2];
                            int O = zalihe[0];
                            if (zalihe[2] < kolicina) {
                                kolicina -= zalihe[2];
                                zalihe[2] = 0;
                                zalihe[0] -= kolicina;
                            }
                            else {
                                zalihe[2] -= kolicina;
                            }
                            List<int> pacijent = new List<int>(n) { O - zalihe[0], 0, B - zalihe[2], 0 };
                            primljenaKrv.Add(pacijent);
                            break;
                        }

                    case "AB":
                        if (kolicina > zalihe.Sum()) {
                            moguce = false;
                            break;
                        }
                        else {
                            int O = zalihe[0];
                            int A = zalihe[1];
                            int B = zalihe[2];
                            int AB = zalihe[3];
                            if (kolicina > zalihe[3]) {
                                kolicina -= zalihe[3];
                                zalihe[3] = 0;
                            }
                            else {
                                zalihe[3] -= kolicina;
                                kolicina = 0;
                            }

                            if (kolicina > zalihe[2]) {
                                kolicina -= zalihe[2];
                                zalihe[2] = 0;
                            }
                            else {
                                zalihe[2] -= kolicina;
                                kolicina = 0;
                            }

                            if (kolicina > zalihe[1]) {
                                kolicina -= zalihe[1];
                                zalihe[1] = 0;
                                zalihe[0] -= kolicina;
                            }
                            else {
                                zalihe[1] -= kolicina;
                            }

                            List<int> pacijent = new List<int>(n) { O - zalihe[0], A - zalihe[1], B - zalihe[2], AB - zalihe[3] };
                            primljenaKrv.Add(pacijent);
                            break;
                        }
                }
            }

            //Korak 3 - ispisujemo da li je moguce i ako jeste koliko je ko primio krvi

            if (moguce) {
                Console.WriteLine("moguce");
                Funkcije.ispisiMatricu(primljenaKrv);
            }
            else {
                Console.WriteLine("nemoguce");
            }
        }
    }
}