#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define ll long long
#define rep(i,l,r)for(ll i=(l);i<(r);i++)
#define repp(i,l,r,k)for(ll i=(l);i<(r);i+=(k))
#define INF ((1LL<<62)-(1LL<<31))
#define max(p,q)((p)>(q)?(p):(q))
#define min(p,q)((p)<(q)?(p):(q))
#define bit(n,m)(((n)>>(m))&1)
int upll(const void*a, const void*b){return*(ll*)a<*(ll*)b?-1:*(ll*)a>*(ll*)b?1:0;}
int downll(const void*a, const void*b){return*(ll*)a<*(ll*)b?1:*(ll*)a>*(ll*)b?-1:0;}
void sortup(ll*a,int n){qsort(a,n,sizeof(ll),upll);}
void sortdown(ll*a,int n){qsort(a,n,sizeof(ll),downll);}
ll pom(ll a,ll n,int m){ll x=1;for(a%=m;n;n/=2)n&1?x=x*a%m:0,a=a*a%m;return x;}
//#define MOD 998244353
#define MOD 1000000007
#define invp(a,p)pom(a,p-2,p)

//辺の情報を個別に持つタイプ
typedef struct edge{ll s,g,c,f,i;}E;
typedef struct graph{
	int vcnt,ecnt;
	E  e[400010];//適宜変える(ecnt)
	int id[100010];//適宜変える(vcnt)
}G;
G g;

int a[100010];
int esort(const void*a,const void*b){
	E*p=(E*)a,*q=(E*)b;
	if((*p).s<(*q).s)return -1;
	if((*p).s>(*q).s)return  1;
	if((*p).g<(*q).g)return -1;
	return 1;
}
int csort(const void*a,const void*b){ll p=(*(E*)a).c,q=(*(E*)b).c;return p<q?-1:p>q?1:0;}
void readgraph(){
	//適宜変える
	ll n,m;
	scanf("%lld%lld",&n,&m);
	rep(i,0,n)scanf("%d",a+i);
	rep(i,0,m){
		ll x,y;
		scanf("%lld%lld",&x,&y);
		x--,y--;
		g.e[i].s=x;
		g.e[i].g=y;
		g.e[i].c=max(a[x],a[y]);
		g.e[i].f=0;
		g.e[i].i=i;
	}
	g.vcnt=n;
	g.ecnt=m;
	qsort(g.e,g.ecnt,sizeof(E),csort);
}


//union-find
#define UFLIMIT (1<<17)
int unicnt[UFLIMIT+10];//正ならcnt、非正なら根のindex
void ufinit(int n){rep(i,0,n)unicnt[i]=1;}
int ufroot(int x){return unicnt[x]<=0?-(unicnt[x]=-ufroot(-unicnt[x])):x;}
int ufsame(int x,int y){return ufroot(x)==ufroot(y);}
void uni(int x,int y){if((x=ufroot(x))==(y=ufroot(y)))return;if(unicnt[x]<unicnt[y]){int t=x;x=y;y=t;}unicnt[x]+=unicnt[y];unicnt[y]=-x;}
#undef UFLIMIT

//クラスカル法
//最小全域木を構成する辺とそのコストの合計を求める
//union findが必要、事前にコストでソートが必要
//O(ElogE)
//*
ll kurasukaru(){
	ll ans=0;
	ufinit(g.vcnt);
	rep(i,0,g.ecnt){
		if(!ufsame(g.e[i].s,g.e[i].g)){
			uni(g.e[i].s,g.e[i].g);
			g.e[i].f=1;
			ans+=g.e[i].c;
		}
	}
	return ans;
}
//*/

//*
void makeinvedge(){
	//逆辺とidx
	qsort(g.e,g.ecnt,sizeof(E),esort);
	int nnn=g.ecnt;
	rep(i,0,g.ecnt){
		int l=0,r=g.ecnt;
		while(r-l>1){
			int m=(l+r)/2;
			if(g.e[m].s<g.e[i].g||(g.e[m].s==g.e[i].g&&g.e[m].g<=g.e[i].s))l=m;
			else r=m;
		}
		g.e[nnn].s=g.e[i].g;
		g.e[nnn].g=g.e[i].s;
		g.e[nnn].c=g.e[i].c;
		g.e[nnn].f=g.e[i].f;
		g.e[nnn].i=g.e[i].i;
		nnn++;
	}
	g.ecnt*=2;
	qsort(g.e,g.ecnt,sizeof(E),esort);
	int p=0;
	rep(i,0,g.vcnt){
		while(p<g.ecnt&&g.e[p].s<i)p++;
		g.id[i]=p;
	}
	g.id[g.vcnt]=g.ecnt;//番兵
}
//*/


int col[100010];
//dfs
int dfs(int v,int pre,int c){
	int flag=1;
	int flag2=a[pre]<=a[v];
	col[v]=c;
	rep(i,g.id[v],g.id[v+1]){
		if(g.e[i].f==1&&g.e[i].g!=pre){
			flag2|=(g.e[i].c==a[v]);
			flag&=dfs(g.e[i].g,v,3-c);
		}
	}
	return flag&flag2;
}

int ans[200010];
int main(){
	readgraph();
	//次数が小さいところから木にできるか？
	kurasukaru();
//	rep(i,0,g.ecnt)printf("%d %d %d %d\n",g.e[i].s,g.e[i].g,g.e[i].c,g.e[i].f);puts("");
	makeinvedge();
//	rep(i,0,g.ecnt)printf("%d %d %d %d\n",g.e[i].s,g.e[i].g,g.e[i].c,g.e[i].f);puts("");
	
	int v=-1,m=2e9;
	rep(i,0,g.vcnt)if(m>a[i])v=i,m=a[i];
	int cnt=0;
	rep(i,0,g.vcnt)if(m==a[i])cnt++;
	if(cnt==1){
		puts("-1");
		return 0;
	}
	
	if(!dfs(v,-1,1)){
		puts("-1");
		return 0;
	}
	rep(i,0,g.vcnt)putchar(col[i]==1?'B':'W');puts("");
	rep(i,0,g.ecnt)ans[g.e[i].i]=g.e[i].f?g.e[i].c:1e9;
	rep(i,0,g.ecnt/2)printf("%d\n",ans[i]);
}

Measured memory_bytes: 25984