#include <bits/stdc++.h>
using namespace std;
namespace mine {
long long qread() {
  long long ans = 0, f = 1;
  char c = getchar();
  while (c < '0' or c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while ('0' <= c and c <= '9') ans = ans * 10 + c - '0', c = getchar();
  return ans * f;
}
void write(long long num) {
  if (num < 0) putchar('-'), num = -num;
  if (num >= 10) write(num / 10);
  putchar('0' + num % 10);
}
void write1(long long num) {
  write(num);
  putchar(' ');
}
void write2(long long num) {
  write(num);
  putchar('\n');
}
template <typename T>
void chmax(T &x, const T y) {
  x = (x > y ? x : y);
}
template <typename T>
void chmin(T &x, const T y) {
  x = (x < y ? x : y);
}
long long gcd(long long x, long long y) { return y ? gcd(y, x % y) : x; }
const int INF = 0x3f3f3f3f;
const int MOD = 998244353;
int mm(const int x) { return x >= MOD ? x - MOD : x; }
template <typename T>
void add(T &x, const int &y) {
  x = (x + y >= MOD ? x + y - MOD : x + y);
}
long long qpower(long long x, long long e, int mod = MOD) {
  long long ans = 1;
  if (e < 0) {
    puts("error");
    exit(666);
  }
  while (e) {
    if (e & 1) ans = ans * x % mod;
    x = x * x % mod;
    e >>= 1;
  }
  return ans;
}
long long invm(long long x) { return qpower(x, MOD - 2); }
const int N = 1e6 + 10;
int D[N];
bool st[N], vis[N];
int cc[N];
pair<int, int> e[N];
int w[N];
map<int, int> id[N];
vector<int> to[N];
void dfs(int x, int col) {
  vis[x] = 1;
  cc[x] = col;
  for (auto y : to[x])
    if (!vis[y] and st[y]) dfs(y, col ^ 1);
}
bool done[N];
void brush(int x, int col) {
  cc[x] = col;
  done[x] = 1;
  for (auto t : id[x]) {
    int y = t.first;
    if (done[y] or D[y] <= D[x] or st[y]) continue;
    w[t.second] = D[y] - D[x];
    brush(y, col);
  }
}
void main() {
  int n = qread(), m = qread();
  for (int i = (1), I = (n); i <= I; i++) D[i] = qread();
  for (int i = (1), I = (m); i <= I; i++) {
    int x = qread(), y = qread();
    e[i] = {x, y};
    id[x][y] = id[y][x] = i;
    if (D[x] == D[y]) to[x].push_back(y), to[y].push_back(x);
  }
  for (int x = (1), I = (n); x <= I; x++) {
    st[x] = 1;
    for (auto t : id[x])
      if (D[t.first] < D[x]) st[x] = 0;
  }
  for (int x = (1), I = (n); x <= I; x++)
    if (st[x] and !vis[x]) {
      if (!((int)(to[x]).size())) {
        write(-1);
        return;
      }
      dfs(x, 1);
    }
  for (int x = (1), I = (n); x <= I; x++)
    if (st[x]) brush(x, cc[x]);
  for (int x = (1), I = (n); x <= I; x++) putchar(cc[x] ? 'B' : 'W');
  puts("");
  for (int i = (1), I = (m); i <= I; i++) {
    int x = e[i].first, y = e[i].second, now;
    if (w[i])
      now = w[i];
    else
      now = max(D[x], D[y]);
    write2(now);
  }
}
};  // namespace mine
signed main() {
  srand(time(0));
  mine::main();
}
