#include <bits/stdc++.h>
using namespace std;
const long long mod = 1000000007;
const long long inf = mod * mod;
const long long d2 = (mod + 1) / 2;
const long double EPS = 1e-9;
const long double INF = 1e+10;
const long double PI = acos(-1.0);
const int C_SIZE = 3100000;
const int UF_SIZE = 3100000;
namespace {
long long fact[C_SIZE];
long long finv[C_SIZE];
long long inv[C_SIZE];
long long Comb(int a, int b) {
  if (a < b || b < 0) return 0;
  return fact[a] * finv[b] % mod * finv[a - b] % mod;
}
void init_C(int n) {
  fact[0] = finv[0] = inv[1] = 1;
  for (int i = 2; i < n; i++) {
    inv[i] = (mod - (mod / i) * inv[mod % i] % mod) % mod;
  }
  for (int i = 1; i < n; i++) {
    fact[i] = fact[i - 1] * i % mod;
    finv[i] = finv[i - 1] * inv[i] % mod;
  }
}
long long pw(long long a, long long b) {
  if (a < 0LL) return 0;
  if (b < 0LL) return 0;
  long long ret = 1;
  while (b) {
    if (b % 2) ret = ret * a % mod;
    a = a * a % mod;
    b /= 2;
  }
  return ret;
}
long long pw_mod(long long a, long long b, long long M) {
  if (a < 0LL) return 0;
  if (b < 0LL) return 0;
  long long ret = 1;
  while (b) {
    if (b % 2) ret = ret * a % M;
    a = a * a % M;
    b /= 2;
  }
  return ret;
}
int pw_mod_int(int a, int b, int M) {
  if (a < 0) return 0;
  if (b < 0) return 0;
  int ret = 1;
  while (b) {
    if (b % 2) ret = (long long)ret * a % M;
    a = (long long)a * a % M;
    b /= 2;
  }
  return ret;
}
int ABS(int a) { return max(a, -a); }
long long ABS(long long a) { return max(a, -a); }
double ABS(double a) { return max(a, -a); }
int sig(double r) { return (r < -EPS) ? -1 : (r > +EPS) ? +1 : 0; }
int UF[UF_SIZE];
void init_UF(int n) {
  for (int i = 0; i < n; i++) UF[i] = -1;
}
int FIND(int a) {
  if (UF[a] < 0) return a;
  return UF[a] = FIND(UF[a]);
}
void UNION(int a, int b) {
  a = FIND(a);
  b = FIND(b);
  if (a == b) return;
  if (UF[a] > UF[b]) swap(a, b);
  UF[a] += UF[b];
  UF[b] = a;
}
}  // namespace
int p[110000];
vector<int> g[110000];
int pr[110000];
int v[110000];
char str[110000];
void dfs(int a) {
  v[a] = 1;
  for (int i = 0; i < g[a].size(); i++) {
    if (v[g[a][i]]) continue;
    if (p[a] > p[g[a][i]]) continue;
    pr[g[a][i]] = a;
    if (str[a] == 'B')
      str[g[a][i]] = 'W';
    else
      str[g[a][i]] = 'B';
    dfs(g[a][i]);
  }
}
map<pair<int, int>, int> M;
int ret[110000];
int main() {
  int a, b;
  scanf("%d%d", &a, &b);
  for (int i = 0; i < a; i++) {
    scanf("%d", p + i);
  }
  for (int i = 0; i < b; i++) {
    int s, t;
    scanf("%d%d", &s, &t);
    s--;
    t--;
    g[s].push_back(t);
    g[t].push_back(s);
    M[make_pair(s, t)] = M[make_pair(t, s)] = i;
  }
  for (int i = 0; i < a; i++) {
    for (int j = 0; j < g[i].size(); j++) {
      if (p[i] == p[g[i][j]]) {
        if (v[i]) continue;
        str[i] = 'B';
        dfs(i);
      }
    }
  }
  for (int i = 0; i < a; i++) {
    if (!v[i]) {
      printf("-1\n");
      return 0;
    }
  }
  for (int i = 0; i < b; i++) ret[i] = 1000000000;
  for (int i = 0; i < a; i++) {
    if (pr[i] == -1) {
      continue;
    }
    ret[M[make_pair(i, pr[i])]] = p[i];
  }
  printf("%s\n", str);
  for (int i = 0; i < b; i++) {
    printf("%d\n", ret[i]);
  }
}
