#include <bits/stdc++.h>
typedef struct List {
  struct List *next;
  int v, id;
} list;
int main() {
  int i, N, M, D[100001], u, w, min = 1 << 30, argmin;
  list *adj[100001] = {}, e[400001], *p;
  scanf("%d %d", &N, &M);
  for (i = 1; i <= N; i++) {
    scanf("%d", &(D[i]));
    if (D[i] < min) {
      min = D[i];
      argmin = i;
    }
  }
  for (i = 0; i < M; i++) {
    scanf("%d %d", &u, &w);
    e[i * 2].v = w;
    e[i * 2 + 1].v = u;
    e[i * 2].id = i;
    e[i * 2 + 1].id = i;
    e[i * 2].next = adj[u];
    e[i * 2 + 1].next = adj[w];
    adj[u] = &(e[i * 2]);
    adj[w] = &(e[i * 2 + 1]);
  }
  char c[100001];
  int flag[100001] = {}, weight[200001], q[100001], head, tail;
  for (i = 0; i < M; i++) weight[i] = 1000000000;
  flag[argmin] = 1;
  c[argmin - 1] = 'B';
  q[0] = argmin;
  for (head = 0, tail = 1; head < tail; head++) {
    u = q[head];
    for (p = adj[u]; p != NULL; p = p->next) {
      w = p->v;
      if (flag[w] == 0 && D[w] >= D[u]) {
        flag[w] = u;
        q[tail++] = w;
        c[w - 1] = (c[u - 1] == 'B') ? 'W' : 'B';
        weight[p->id] = D[w];
      }
    }
  }
  for (p = adj[argmin]; p != NULL; p = p->next)
    if (D[p->v] == D[argmin]) break;
  if (head < N || p == NULL)
    printf("-1\n");
  else {
    c[N] = 0;
    printf("%s\n", c);
    for (i = 0; i < M; i++) printf("%d\n", weight[i]);
  }
  fflush(stdout);
  return 0;
}
