#include <bits/stdc++.h>
#pragma GCC optimize("O3")
template <class T>
bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T>
bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T>
T gcd(T a, T b) {
  if (a < b) std::swap(a, b);
  while (b) std::swap(a %= b, b);
  return a;
}
template <class T>
T lcm(const T a, const T b) {
  return a / gcd(a, b) * b;
}
using ll = long signed long;
using ull = long unsigned long;
using ld = long double;
using namespace std;
struct inp {
  size_t sz;
  inp(size_t _sz = 1) : sz(_sz) {}
  template <typename T>
  operator T() const {
    T a;
    cin >> a;
    return a;
  }
  template <typename T>
  operator vector<T>() const {
    vector<T> a(sz);
    for (size_t i = 0; i < sz; i++) cin >> a[i];
    return a;
  }
  template <typename T, typename U>
  operator pair<T, U>() const {
    T f;
    U s;
    cin >> f >> s;
    return pair<T, U>(f, s);
  }
};
inp inp1;
template <typename T>
void say(T &x, char end = '\n') {
  cout << x << end;
}
template <typename T>
void say(vector<T> &x, char sep = ' ', char end = '\n') {
  for (size_t i = 0, sz = x.size(); i < sz; i++) {
    cout << x[i] << (i == sz - 1 ? end : sep);
  }
}
struct union_find {
  vector<ull> par;
  vector<ull> num;
  union_find(ull n) : par(n, 0), num(n, 1) {
    iota((par).begin(), (par).end(), 0);
  }
  ull root(ull i) { return par[i] == i ? i : (par[i] = root(par[i])); }
  bool same(ull i, ull j) { return root(i) == root(j); }
  void unite(ull i, ull j) {
    ull ri = root(i);
    ull rj = root(j);
    if (ri != rj) {
      if (num[ri] > num[rj]) swap(ri, rj);
      par[ri] = rj;
      num[rj] += num[ri];
    }
  }
};
int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  ll n = inp1;
  ll m = inp1;
  vector<ll> d = inp(n);
  vector<ll> u(m), v(m);
  for (long long i = 0, i_len = (m); i < i_len; i++) {
    cin >> u[i] >> v[i];
    u[i]--;
    v[i]--;
  }
  vector<ll> e(m, 1e9);
  vector<ll> f(m, 0);
  for (long long i = 0, i_len = (m); i < i_len; i++) {
    e[i] = max(d[u[i]], d[v[i]]);
  }
  vector<ll> er(m);
  iota((er).begin(), (er).end(), 0);
  sort((er).begin(), (er).end(), [&](ll i, ll j) { return e[i] < e[j]; });
  union_find uf(n);
  for (long long _i = 0, _i_len = (m); _i < _i_len; _i++) {
    ll i = er[_i];
    if (!uf.same(u[i], v[i])) {
      f[i] = 1;
      uf.unite(u[i], v[i]);
    }
  }
  vector<vector<ll>> g(n);
  string s(n, ' ');
  vector<ll> c(n, 1e9);
  for (long long i = 0, i_len = (m); i < i_len; i++) {
    if (f[i]) {
      g[u[i]].push_back(v[i]);
      g[v[i]].push_back(u[i]);
    }
  }
  deque<ll> q = {0};
  s[0] = 'W';
  while (q.size()) {
    ll i = q.front();
    q.pop_front();
    for (ll j : g[i]) {
      if (s[j] == ' ') {
        s[j] = s[i] ^ 'W' ^ 'B';
      }
    }
  }
  vector<ll> dp(n, 0x7FFFFFFF);
  for (long long i = 0, i_len = (m); i < i_len; i++) {
    if (f[i]) {
      chmin(dp[u[i]], e[i]);
      chmin(dp[v[i]], e[i]);
    }
  }
  bool okay = true;
  for (long long i = 0, i_len = (n); i < i_len; i++) {
    if (dp[i] != d[i]) {
      okay = false;
      break;
    }
  }
  if (!okay) {
    cout << -1 << endl;
  } else {
    for (long long i = 0, i_len = (m); i < i_len; i++)
      if (f[i]) c[i] = e[i];
    say(s);
    say(c, '\n');
  }
}
