#include <bits/stdc++.h>
using namespace std;
const int _ = 2e5 + 7;
struct Edge {
  int end, id, upEd;
} Ed[_ << 1];
int head[_], N, M, val[_], D[_], col[_], cntEd;
void addEd(int a, int b, int c) {
  Ed[++cntEd] = (Edge){b, c, head[a]};
  head[a] = cntEd;
}
int fa[_], sz[_];
bool vis[_];
int find(int x) { return fa[x] == x ? x : (fa[x] = find(fa[x])); }
void dfs(int x, int p, int c) {
  col[x] = c;
  vis[x] = 1;
  for (int i = head[x]; i; i = Ed[i].upEd)
    if (Ed[i].end != p)
      if (D[Ed[i].end] == D[x] && !vis[Ed[i].end]) {
        dfs(Ed[i].end, x, c ^ 1);
        val[Ed[i].id] = D[x];
      } else if (D[Ed[i].end] <= D[x])
        val[Ed[i].id] = 1e9;
}
int main() {
  cin >> N >> M;
  for (int i = 1; i <= N; ++i) cin >> D[i];
  for (int i = 1; i <= M; ++i) {
    int s, t;
    cin >> s >> t;
    addEd(s, t, i);
    addEd(t, s, i);
  }
  vector<int> pos;
  for (int i = 1; i <= N; ++i) pos.push_back(i);
  sort(pos.begin(), pos.end(), [&](int x, int y) { return D[x] < D[y]; });
  for (int i = 0, pi; i < N; i = pi) {
    pi = i;
    while (pi < N && D[pos[pi]] == D[pos[i]]) {
      sz[fa[pos[pi]] = pos[pi]] = 1;
      ++pi;
    }
    for (int j = i; j < pi; ++j)
      for (int k = head[pos[j]]; k; k = Ed[k].upEd)
        if (D[Ed[k].end] == D[pos[j]] && find(Ed[k].end) != find(pos[j])) {
          sz[find(pos[j])] += sz[find(Ed[k].end)];
          fa[find(Ed[k].end)] = find(pos[j]);
        }
    for (int j = i; j < pi; ++j)
      if (fa[pos[j]] == pos[j])
        if (sz[pos[j]] > 1)
          dfs(pos[j], 0, 0);
        else {
          bool flg = 0;
          for (int k = head[pos[j]]; k; k = Ed[k].upEd)
            if (D[Ed[k].end] < D[pos[j]])
              if (!flg) {
                col[pos[j]] = col[Ed[k].end] ^ 1;
                val[Ed[k].id] = D[pos[j]] - D[Ed[k].end];
                flg = 1;
              } else
                val[Ed[k].id] = 1e9;
          if (!flg) {
            puts("-1");
            return 0;
          }
        }
  }
  for (int i = 1; i <= N; ++i) putchar(col[i] ? 'W' : 'B');
  cout << endl;
  for (int i = 1; i <= M; ++i) cout << val[i] << endl;
  return 0;
}
