#include<cstdio>
#include<vector>
#include<list>
#include<map>
#include<set>
#include<deque>
#include<bitset>
#include<stack>
#include<algorithm>
#include<functional>
#include<numeric>
#include<utility>
#include<sstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<queue>

using namespace std;

#define pb push_back
#define mp make_pair
#define sz(a) ((int)(a.size()))
#define all(a) a.begin(),a.end()
#define EPS 1e-11
#define REP(i,n) for(int (i)=0;i<(n);++i)
#define REPS(i,n) for(int(i)=0;i<(n.size());++i)
#define FOR(i,a,b) for(int(i)=(a);i<=(b);++i)
#define FORD(i,a,b) for(int(i)=(a);i>=(b);--i)
#define FORE(it,c) for(__typeof((c).begin()) it=(c).begin();it!=(c).end();++it)

#define LL long long
#define SQR(a) ((a)*(a))

int N;
multiset <int> q,q2;

bool go(int k,int v)
{
	int stav=0;
	q=q2;
	REP(i,N)
	{
		if (stav>0)
		{
			multiset<int>::iterator x=q.upper_bound(k+stav);
			if (x==q.begin()) return 0;
			x--;
			if (abs(stav-(*x))>k) return 0;
			stav-=(*x);
			if (v&&i) putchar(32);
			if (v) printf("%d-A",*x);
			q.erase(x);
		}
		else
		{
			multiset<int>::iterator x=q.upper_bound(k-stav);
			if (x==q.begin()) return 0;
			x--;
			if (abs(stav+(*x))>k) return 0;
			stav+=(*x);
			if (v&&i) putchar(32);
			if (v) printf("%d-B",*x);
			q.erase(x);
		}
	}
	if (v) putchar(10);
	return 1;
}

int main()
{
	while(scanf("%d",&N),N)
	{
		q2.clear();
		REP(i,N)
		{
			int x;
			scanf("%d",&x);
			q2.insert(x);
		}
		int d=0,h=200000;
		while(d<h)
		{
			int m=(d+h)/2;
			if (go(m,0))
			{
				h=m;
			}
			else d=m+1;
		}
		go(d,1);
	}
	return 0;
}
