#include <iostream>
#include <sstream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <cstring>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <set>
#include <bitset>
#include <numeric>
#include <utility>
#include <iomanip>
#include <algorithm>
#include <functional>
#include <unordered_map>
using namespace std;

template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }

#define COUT(x) cout << #x << " = " << (x) << " (L" << __LINE__ << ")" << endl
template<class T1, class T2> ostream& operator << (ostream &s, pair<T1,T2> P)
{ return s << '<' << P.first << ", " << P.second << '>'; }
template<class T> ostream& operator << (ostream &s, vector<T> P)
{ for (int i = 0; i < P.size(); ++i) { if (i > 0) { s << " "; } s << P[i]; } return s; }
template<class T> ostream& operator << (ostream &s, vector<vector<T> > P)
{ for (int i = 0; i < P.size(); ++i) { s << endl << P[i]; } return s << endl; }

#define EACH(i, s) for (__typeof__((s).begin()) i = (s).begin(); i != (s).end(); ++i)
template<class T> ostream& operator << (ostream &s, set<T> P)
{ EACH(it, P) { s << "<" << *it << "> "; } return s << endl; }
template<class T1, class T2> ostream& operator << (ostream &s, map<T1,T2> P)
{ EACH(it, P) { s << "<" << it->first << "->" << it->second << "> "; } return s << endl; }

template<class T> vector<T> make_vec(size_t a) { return vector<T>(a); }
template<class T, class... Ts> auto make_vec(size_t a, Ts... ts) {
  return vector<decltype(make_vec<T>(ts...))>(a, make_vec<T>(ts...));
}
template<class T, class V>
typename enable_if<is_class<T>::value == 0>::type fill(T &t, const V &v) {
    t = v;
}
template<class T, class V>
typename enable_if<is_class<T>::value != 0>::type fill(T &t, const V &v){
    for (auto &e : t) fill(e, v);
}



const int INF = 1<<30;
using pint = pair<int, int>;

using Graph = vector<vector<pint>>;
int N, M;
Graph G;

vector<pint> D;
map<long long, set<int>> ma;


void solve() {
    ma.clear();
    for (int i = 0; i < N; ++i) ma[D[i].first].insert(D[i].second);

    vector<int> col(N, -1);
    vector<int> res(M);

    for (auto it : ma) {
        int val = it.first;
        auto vs = it.second;

        //COUT(val); COUT(vs);

        for (auto v : vs) {
            vector<pint> nei;
            for (auto nv : G[v]) {
                if (vs.count(nv.first) || col[nv.first] != -1) {
                    nei.push_back(nv);
                }
            }

            //COUT(v); COUT(nei);
            
            if (nei.empty()) {
                cout << -1 << endl;
                return;
            }

            if (col[nei[0].first] == -1) {
                col[v] = 1;
                col[nei[0].first] = 0;
            }
            else {
                col[v] = 1 - col[nei[0].first];
            }
            res[nei[0].second] = val;
            for (auto nv : G[v]) {
                if (nv.first == nei[0].first) continue;
                res[nv.second] = INF;
            }
        }
    }

    for (int i = 0; i < N; ++i) {
        if (col[i] == 0) cout << "B";
        else cout << "W";
    }
    cout << endl;
    for (int i = 0; i < M; ++i) {
        cout << res[i] << endl;
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    
    while (cin >> N >> M) {
        D.resize(N);
        for (int i = 0; i < N; ++i) {
            cin >> D[i].first;
            D[i].second = i;
        }
        G.assign(N, vector<pint>());
        for (int i = 0; i < M; ++i) {
            int u, v; cin >> u >> v; --u, --v;
            G[u].push_back({v, i});
            G[v].push_back({u, i});
        }
        solve();
    }
}
















