using System;

class Program
{
    struct Pacijent
    {
        public string grupa;
        public int doze;
    }
    public static void Main(string[] args)
    {
        int BrojPacijenata=int.Parse(Console.ReadLine());
        string[]grupe=Console.ReadLine().Split();
        Pacijent[]pacijent= new Pacijent[BrojPacijenata];
        for(int i = 0; i < BrojPacijenata; i++)
        {
            string[]s= Console.ReadLine().Split();
            pacijent[i].grupa = s[0];
            pacijent[i].doze = int.Parse(s[1]);
        }
        int[,] dozice = new int[pacijent.Length, grupe.Length];
        int O = int.Parse(grupe[0]);
        int A = int.Parse(grupe[1]);
        int B = int.Parse(grupe[2]);
        int AB = int.Parse(grupe[3]);
        int dozA = A, dozB = B, dozO = O, dozAB = AB;
        for (int i = 0; i < pacijent.Length; i++)
        {
            int doze = pacijent[i].doze;
            string grupica = pacijent[i].grupa;
            if (grupica == "A")
            {
                Raspored(dozice,ref doze, i, A, 1, O, 0, ref dozA, ref dozO);
                if (dozA < 0 || dozO < 0)
                {
                    dozice[0, 0] = -1;
                    break;
                }dozA = A; dozB = B; dozO = O; dozAB = AB;
            }
            
            else if (grupica == "B")
            {
                Raspored(dozice,ref doze, i, B, 2, O, 0, ref dozB, ref dozO);
                if (dozB < 0 || dozO < 0)
                {
                    dozice[0, 0] = -1;
                    break;
                } dozA = A; dozB = B; dozO = O; dozAB = AB;
            }
           
            else if (grupica == "AB")
            {
                Raspored(dozice,ref doze, i, AB, 3, O, 0, ref dozAB, ref dozO);
                if (doze > 0&&dozAB==0)
                    Raspored(dozice,ref doze, i, A, 1, B, 2, ref dozA, ref dozB);
                if (dozAB < 0 || dozO < 0 || dozA < 0 || dozB < 0)
                {
                    dozice[0, 0] = -1;
                    break;
                }                dozA = A; dozB = B; dozO = O; dozAB = AB;
            }
            
            else if(grupica=="O")
            {
                if (O == doze || O > doze)
                {
                    dozice[i, 0] = doze;
                    dozO -= O;
                }
                else
                {
                    dozO = -1;
                }
                if (dozA < 0 )
                {
                    dozice[0, 0] = -1;
                    break;
                }

            }
            dozA = A; dozB = B; dozO = O; dozAB = AB;
        }
        if (dozice[0, 0] == -1)
        {
            Console.WriteLine("nemoguce");
        }
        else
        {
            Console.WriteLine("moguce");
            for(int i = 0; i < dozice.GetLength(0); i++)
            {                
                for (int j = 0; j < dozice.GetLength(1); j++)
                {
                    Console.Write(dozice[i,j]);
                }
                Console.WriteLine();    
            }
        }
    }

    static int[,] Raspored(int[,]mat,ref int d, int red,int slovo,int redSlova,int slovO,int d0,ref int doZ,ref int doZO)
    {
        //if (slovo != 0)
        //{
            if (slovo == d || slovo > d)
            {
                mat[red, redSlova] = d;
                doZ -= d;
                d -= slovo;
            }
            else
            {
                mat[red, redSlova] = slovo;
                d -= slovo;
                slovo = 0;
                doZ-=d;
            }
        //}
            
        if (d>0&&slovo==0&&slovO>0)
        {           
            if (slovO >= d)
            {
                mat[red, d0] = d;
                doZO -= d;
                d = 0;
            }
            else
            {
                doZO -= d;
            }
        }
        return mat;
    }
}