#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using Pi = pair<int, int>;
using Pl = pair<ll, ll>;
using vint = vector<int>;
using vll = vector<ll>;
template <typename T>
using uset = unordered_set<T>;
template <typename T1, typename T2>
using umap = unordered_map<T1, T2>;
constexpr int INF = (1 << 30) - 1;
constexpr ll LLINF = 1LL << 60;
constexpr int dy[] = {1, 0, -1, 0, 1, -1, -1, 1};
constexpr int dx[] = {0, 1, 0, -1, 1, 1, -1, -1};
constexpr char el = '\n';
constexpr int mod = 1000000007;
template <typename T>
T gcd(T a, T b) {
  return (b ? gcd(b, a % b) : a);
}
template <typename T>
T lcm(T a, T b) {
  return (a / gcd(a, b) * b);
}
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;
}
struct Edge {
  ll to, idx;
  Edge() {}
  Edge(int to, int idx) : to(to), idx(idx) {}
};
vector<vector<Edge>> G(100005);
ll N, M;
ll D[100005];
ll U[200005], V[200005];
ll ans[200005];
bool flag[100005] = {};
int main() {
  cin >> N >> M;
  string color(N, '.');
  for (int i = 0; i < N; i++) {
    cin >> D[i];
  }
  char inv[256];
  inv['B'] = 'W';
  inv['W'] = 'B';
  priority_queue<Pl, vector<Pl>, greater<Pl>> que;
  fill_n(ans, 200005, 1000000000);
  for (int i = 0; i < M; i++) {
    cin >> U[i] >> V[i];
    --V[i], --U[i];
    if (D[U[i]] == D[V[i]]) {
      if (color[U[i]] == '.' && color[V[i]] == '.') {
        color[U[i]] = 'B';
        color[V[i]] = 'W';
      } else if (color[U[i]] != '.')
        color[V[i]] = inv[color[U[i]]];
      else if (color[V[i]] != '.')
        color[U[i]] = inv[color[V[i]]];
      ans[i] = D[U[i]];
      flag[U[i]] = true;
      flag[V[i]] = true;
      que.emplace(D[U[i]], U[i]);
      que.emplace(D[U[i]], V[i]);
    } else {
      G[U[i]].emplace_back(V[i], i);
      G[V[i]].emplace_back(U[i], i);
    }
  }
  while (!que.empty()) {
    auto d = que.top();
    que.pop();
    ll v = d.second;
    for (auto &u : G[v]) {
      if (flag[u.to] == false && D[u.to] > D[v]) {
        ans[u.idx] = D[u.to] - D[v];
        flag[u.to] = true;
        color[u.to] = color[v];
        que.emplace(D[u.to], u.to);
      }
    }
  }
  int cnt = count(flag, flag + N, true);
  if (cnt < N) {
    cout << -1 << endl;
    return (0);
  }
  cout << color << endl;
  for (int i = 0; i < M; i++) {
    cout << ans[i] << el;
  }
  return (0);
}
