#include<iostream>
#include<algorithm>
#include <unordered_map>
using namespace std;
struct ljudi
{
    string kg;
    int pot;
    unordered_map<string,int> resenje;
    
    ljudi()
    {
        resenje["O"] = 0;
        resenje["A"] = 0;
        resenje["B"] = 0;
        resenje["AB"] = 0;
    }
};
bool zbir_resenje(ljudi niz[], int n, long long zbir_pot)
{
    long long zbir_res = 0;
    for(int i = 0; i < n; i++)
        zbir_res += (niz[i].resenje["O"] + niz[i].resenje["A"] + niz[i].resenje["B"] + niz[i].resenje["AB"]);
    return zbir_res==zbir_pot;
}
int main()
{
    int n, A, O, B, AB;
    long long zbir_pot = 0;
    cin >>n;
    unordered_map<string,int> zalihe;
    cin >> O >> A >> B >> AB;
    zalihe["O"] = O;
    zalihe["A"] = A;
    zalihe["B"] = B;
    zalihe["AB"] = AB;
    ljudi niz[n];
    //ulaz
    for(int i = 0; i < n; i++)
    {
        cin >> niz[i].kg >> niz[i].pot;
        zbir_pot += niz[i].pot;
    }
    
    //prvi krug dodavanja
    for(int i = 0; i < n; i++)
    {
        int razlika = min(zalihe[niz[i].kg], niz[i].pot);
        zalihe[niz[i].kg] -= razlika;
        niz[i].pot -= razlika;
        niz[i].resenje[niz[i].kg] += razlika;
    }
    int mesto;
    for(int i = 0; i < n; i++)
    {
        if(niz[i].kg == "A" || niz[i].kg == "B")
        {
            int razlika = min(zalihe["O"], niz[i].pot);
            zalihe["O"] -= razlika;
            niz[i].pot -= razlika;
            niz[i].resenje["O"] += razlika;
        }
        if(zalihe["O"] == 0) break;
    }
    for(int mesto = 0; mesto < n; mesto++)
    {
        if(niz[mesto].kg == "AB")
        {
            //AB za O
            int razlika = min(zalihe["O"], niz[mesto].pot);
            zalihe["O"] -= razlika;
            niz[mesto].pot -= razlika;
            niz[mesto].resenje["O"] += razlika;
            //AB za A
            razlika = min(zalihe["A"], niz[mesto].pot);
            zalihe["A"] -= razlika;
            niz[mesto].pot -= razlika;
            niz[mesto].resenje["A"] += razlika;
            //AB za B
            razlika = min(zalihe["B"], niz[mesto].pot);
            zalihe["B"] -= razlika;
            niz[mesto].pot -= razlika;
            niz[mesto].resenje["B"] += razlika;
        }
        if(zalihe["O"] == 0 && zalihe["A"] == 0 && zalihe["B"] == 0) break;
    }
    
    //ispis
    if(zbir_resenje(niz, n, zbir_pot))
    {
        cout << "moguce\n";
        for(int i = 0; i < n; i++)
        {
            cout << niz[i].resenje["O"] <<" "<< niz[i].resenje["A"]<<" "<<niz[i].resenje["B"] <<" "<< niz[i].resenje["AB"] << "\n";
        }
    }else
        cout << "nemoguce";
    return 0;
}