#include<bits/stdc++.h>
using namespace std;
using Int = long long;
template<typename T1,typename T2> inline void chmin(T1 &a,T2 b){if(a>b) a=b;}
template<typename T1,typename T2> inline void chmax(T1 &a,T2 b){if(a<b) a=b;}


template<typename T> void drop(const T &x){cout<<x<<endl;exit(0);}

//INSERT ABOVE HERE
signed main(){
  Int n,m;
  cin>>n>>m;
  vector<Int> ds(n);
  for(Int i=0;i<n;i++) cin>>ds[i];
  using P = pair<Int, Int>;
  map<P, Int> idx;
  vector< vector<Int> > G(n);
  for(Int i=0;i<m;i++){
    Int u,v;
    cin>>u>>v;
    u--;v--;
    idx[minmax({u,v})]=i;
    G[u].emplace_back(v);
    G[v].emplace_back(u);
  }

  vector<P> vp;
  for(Int i=0;i<n;i++)
    vp.emplace_back(ds[i],i);
  sort(vp.begin(),vp.end());

  const Int INF = 1e9;
  vector<Int> cs(n,-1);
  vector<Int> ans(m,INF);

  // same value
  for(auto p:vp){
    Int v=p.second;
    for(Int u:G[v]){
      if(~cs[u]) continue;
      if(ds[u]==ds[v]){
        if(cs[v]<0) cs[v]=0;
        cs[u]=!cs[v];
        ans[idx[minmax({u,v})]]=ds[v];
      }
    }
  }

  // other value
  for(auto p:vp){
    Int v=p.second;
    if(~cs[v]) continue;
    for(Int u:G[v]){
      if(ds[u]>ds[v]) continue;
      assert(ds[u]<ds[v]);
      assert(~cs[u]);
      cs[v]=!cs[u];
      ans[idx[minmax({u,v})]]=ds[v];
      break;
    }
    if(cs[v]<0) drop(-1);
  }

  for(Int i=0;i<n;i++) cout<<"BW"[cs[i]];
  cout<<endl;
  for(Int i=0;i<m;i++) cout<<ans[i]<<endl;
  return 0;
}
