using System;

public class Program
{
	public static void Main()
	{
		const int O = 0;
		const int A = 1;
		const int B = 2;
		const int AB = 3;

		int N = Convert.ToInt32(Console.ReadLine());
		string[] zalihe = Console.ReadLine().Split(' ');

		int O_zalihe = Convert.ToInt32(zalihe[O]);
		int A_zalihe = Convert.ToInt32(zalihe[A]);
		int B_zalihe = Convert.ToInt32(zalihe[B]);
		int AB_zalihe = Convert.ToInt32(zalihe[AB]);

		string[] krvneGrupe = new string[N];
		int[] jediniceKrvi = new int[N];
		for (int i = 0; i < N; i++)
		{
			string[] ulaz = Console.ReadLine().Split(' ');
			krvneGrupe[i] = ulaz[0];
			jediniceKrvi[i] = Convert.ToInt32(ulaz[1]);
		}

		bool uspesnoDodeljenaKrv = true;
		int[,] primljeneZalihe = new int[N, 4];
		//dodela zaliha O krvne gurpe
		for (int i = 0; i < N; i++)
		{
			if (krvneGrupe[i] == "O")
			{
				if (jediniceKrvi[i] <= O_zalihe)
				{
					O_zalihe -= jediniceKrvi[i];
					primljeneZalihe[i, O] += jediniceKrvi[i];
				}
				else
				{
					uspesnoDodeljenaKrv = false;
					break;
				}
			}
		}

		//dodela zaliha A i B krvnih grupa
		if (uspesnoDodeljenaKrv)
		{
			for (int i = 0; i < N; i++)
			{
				if (krvneGrupe[i] == "A")
				{
					if (jediniceKrvi[i] <= A_zalihe)
					{
						A_zalihe -= jediniceKrvi[i];
						primljeneZalihe[i, A] += jediniceKrvi[i];
					}
					else if (jediniceKrvi[i] <= A_zalihe + O_zalihe)
					{
						primljeneZalihe[i, A] += A_zalihe;
						primljeneZalihe[i, O] += jediniceKrvi[i] - A_zalihe;
						O_zalihe -= jediniceKrvi[i] - A_zalihe;
						A_zalihe = 0;
					}
					else
					{
						uspesnoDodeljenaKrv = false;
						break;
					}
				}
				else if (krvneGrupe[i] == "B")
				{
					if (jediniceKrvi[i] <= B_zalihe)
					{
						B_zalihe -= jediniceKrvi[i];
						primljeneZalihe[i, B] += jediniceKrvi[i];
					}
					else if (jediniceKrvi[i] <= B_zalihe + O_zalihe)
					{
						primljeneZalihe[i, B] += B_zalihe;
						primljeneZalihe[i, O] += jediniceKrvi[i] - B_zalihe;
						O_zalihe -= jediniceKrvi[i] - B_zalihe;
						B_zalihe = 0;
					}
					else
					{
						uspesnoDodeljenaKrv = false;
						break;
					}
				}
			}
		}
        //dodela preostalih zaliha AB krvnoj grupi
		if (uspesnoDodeljenaKrv)
		{
			for (int i = 0; i < N; i++)
			{
				if (krvneGrupe[i] == "AB")
				{
					if (jediniceKrvi[i] <= AB_zalihe)
					{
						AB_zalihe -= jediniceKrvi[i];
						primljeneZalihe[i, AB] += jediniceKrvi[i];
					}
					else if (jediniceKrvi[i] <= AB_zalihe + A_zalihe + B_zalihe + O_zalihe)
					{
						int potrebneJedinice = jediniceKrvi[i];
						potrebneJedinice -= AB_zalihe;
						primljeneZalihe[i, AB] += AB_zalihe;
						AB_zalihe = 0;
						if (potrebneJedinice <= A_zalihe)
						{
							A_zalihe -= potrebneJedinice;
							primljeneZalihe[i, A] += potrebneJedinice;
						}
						else
						{
							primljeneZalihe[i, A] += A_zalihe;
							potrebneJedinice -= A_zalihe;
							A_zalihe = 0;
							if (potrebneJedinice == 0) continue;
							if (potrebneJedinice <= B_zalihe)
							{
								B_zalihe -= potrebneJedinice;
								primljeneZalihe[i, B] += potrebneJedinice;
							}
							else
							{
								primljeneZalihe[i, B] += B_zalihe;
								potrebneJedinice -= B_zalihe;
								B_zalihe = 0;
								if (potrebneJedinice == 0) continue;
								else
								{
									O_zalihe -= potrebneJedinice;
									primljeneZalihe[i, O] += potrebneJedinice;
								}
							}

						}
					}
					else
					{
						uspesnoDodeljenaKrv = false;
						break;
					}
				}
			}
		}

		if (uspesnoDodeljenaKrv)
		{
			Console.WriteLine("moguce");
			for (int i = 0; i < N; i++)
				Console.WriteLine(primljeneZalihe[i, O] + " " + primljeneZalihe[i, A] + " " + primljeneZalihe[i, B] + " " + primljeneZalihe[i, AB]);
		}
		else
		{
			Console.WriteLine("nemoguce");
		}
	}

}