#include <bits/stdc++.h>
using namespace std;
vector<pair<int, int>> adj[100000];
vector<int> tree[100000];
vector<tuple<int, int, int>> E;
bool used[100000];
string ans;
int V[100000], res[200000], color[100000];
int find_(int a) { return color[a] = color[a] == a ? a : find_(color[a]); }
void union_(int a, int b) { color[find_(a)] = find_(b); }
void dfs(int c, int v) {
  used[c] = false;
  ans[c] = v ? 'B' : 'W';
  for (auto n : tree[c])
    if (used[n]) dfs(n, !v);
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  ((void)0);
  ((void)0);
  ((void)0);
  int N, M, tot = 1;
  queue<int> Q;
  cin >> N >> M;
  for (int i = 0; i < N; i++) {
    cin >> V[i];
    color[i] = i;
  }
  for (int i = 0; i < M; i++) {
    int a, b;
    cin >> a >> b;
    adj[--a].emplace_back(--b, i);
    adj[b].emplace_back(a, i);
    if (V[a] == V[b]) {
      res[i] = V[a];
      Q.push(a);
      Q.push(b);
      if (find_(a) != find_(b)) {
        union_(a, b);
        tree[a].push_back(b);
        tree[b].push_back(a);
      }
    } else
      res[i] = 1e9;
  }
  ans.resize(N);
  while (!Q.empty()) {
    int c = Q.front();
    Q.pop();
    tot++;
    for (auto n : adj[c])
      if (V[n.first] >= V[c] && !used[n.first]) {
        if (find_(c) != find_(n.first)) {
          union_(c, n.first);
          tree[c].push_back(n.first);
          tree[n.first].push_back(c);
        }
        used[n.first] = true;
        res[n.second] = V[n.first];
        Q.push(n.first);
      }
  }
  if (tot < N) {
    cout << "-1\n";
    return 0;
  }
  for (int i = 0; i < N; i++)
    if (used[i]) dfs(i, 0);
  cout << ans << '\n';
  for (int i = 0; i < M; i++) cout << res[i] << '\n';
  return 0;
}
