#include <bits/stdc++.h>
using namespace std;
const long long mod = 1000000007;
const long long mod998 = 998244353;
const long long intmax = 2147483647;
const long long llmax = 9223372036854775807;
const char sp = ' ';
struct edge {
  int to, id;
};
int N, M, D[100000], dist[200000], uf[100000], col[100000];
vector<edge> e[100000];
int par(int x) {
  if (uf[x] == x) return x;
  return uf[x] = par(uf[x]);
}
void uni(int x, int y) {
  x = par(x);
  y = par(y);
  uf[x] = y;
  if (col[y] == -1) {
    col[y] = col[x];
  } else
    assert(col[x] == -1);
}
int main() {
  cin >> N >> M;
  for (int i = 0; i < N; i++) {
    cin >> D[i];
    uf[i] = i;
    col[i] = -1;
  }
  for (int i = 0; i < M; i++) {
    int u, v;
    cin >> u >> v;
    u--;
    v--;
    e[u].push_back({v, i});
    e[v].push_back({u, i});
  }
  for (int i = 0; i < N; i++) {
    bool f = false;
    for (int j = 0; j < e[i].size(); j++) {
      if (D[e[i][j].to] < D[i]) {
        f = true;
        dist[e[i][j].id] = D[i] - D[e[i][j].to];
        uni(e[i][j].to, i);
        break;
      }
    }
    if (!f) {
      for (int j = 0; j < e[i].size(); j++) {
        if (D[e[i][j].to] == D[i]) {
          f = true;
          dist[e[i][j].id] = D[i];
          if (col[par(e[i][j].to)] != -1) {
            col[par(i)] = (col[par(e[i][j].to)] ^ 1);
          } else {
            col[par(i)] = 1;
          }
          break;
        }
      }
    }
    if (!f) {
      cout << -1 << endl;
      return 0;
    }
  }
  for (int i = 0; i < N; i++) {
    cout << (col[par(i)] ? 'W' : 'B');
  }
  cout << endl;
  for (int i = 0; i < M; i++) {
    if (!dist[i]) dist[i] = 1000000000;
    cout << dist[i] << endl;
  }
}
