#include <bits/stdc++.h>
bool local = false;
using namespace std;
template <class T>
string toString(T x) {
  ostringstream sout;
  sout << x;
  return sout.str();
}
template <class T>
void print(T v) {
  cout << ((int)(v).size()) << "\n";
  for (auto x : v) cout << x << ' ';
  cout << "\n";
};
template <class T1, class T2>
ostream &operator<<(ostream &o, pair<T1, T2> x) {
  return o << x.first << ' ' << x.second;
}
template <class T1, class T2>
istream &operator>>(istream &o, pair<T1, T2> &x) {
  return o >> x.first >> x.second;
}
template <class T1, class T2>
pair<T1, T2> operator+(pair<T1, T2> a, pair<T1, T2> b) {
  a.first += b.first;
  a.second += b.second;
  return a;
}
template <class T1, class T2>
pair<T1, T2> operator-(pair<T1, T2> a, pair<T1, T2> b) {
  a.first -= b.first;
  a.second -= b.second;
  return a;
}
template <class T1, class T2>
void operator+=(pair<T1, T2> &a, pair<T1, T2> b) {
  a.first += b.first;
  a.second += b.second;
}
template <class T1, class T2>
void operator-=(pair<T1, T2> &a, pair<T1, T2> b) {
  a.first -= b.first;
  a.second -= b.second;
}
int nint() {
  int x;
  cin >> x;
  return x;
}
double getTime() { return clock() / (double)CLOCKS_PER_SEC; };
mt19937 rnd(0);
int rand(int n) { return rnd() % n; }
int rand(int l, int r) { return rnd() % (r - l + 1) + l; }
const int mod = 1000000000 + 7;
void initIO() {
  if (local) {
    freopen("input.txt", "r", stdin);
    srand((int)time(0));
    rnd.seed((int)time(0));
  } else {
    {
      ios::sync_with_stdio(0);
      cin.tie(0);
      cout.tie(0);
    };
  }
}
void solve();
int main() {
  initIO();
  int tc = 1;
  for (int tt = 0; tt < (tc); tt++) {
    solve();
  }
  if (local)
    cout << "\n"
         << "time = " << getTime() << "\n";
}
int n;
int m;
int val[100500];
int color[100500];
vector<int> v[100500];
bool f(int a, int b) { return val[a] <= val[b]; }
int x1[100500], x2[100500];
void solve() {
  cin >> n >> m;
  for (int i = 0; i < (n); i++) cin >> val[i];
  for (int i = 0; i < (m); i++) {
    int x, y;
    cin >> x >> y;
    x--;
    y--;
    v[x].emplace_back(y);
    v[y].emplace_back(x);
    x1[i] = x;
    x2[i] = y;
  }
  for (int x = 0; x < (n); x++) {
    int ok = 0;
    for (int y : v[x])
      if (val[y] <= val[x]) ok = 1;
    if (!ok) {
      cout << -1;
      return;
    }
  }
  vector<int> id(n);
  iota(id.begin(), id.end(), 0);
  sort(id.begin(), id.end(), f);
  memset(color, -1, sizeof(color));
  for (int x : id) {
    int xx = -1;
    for (int y : v[x]) {
      if (color[y] != -1) {
        color[x] = 1 ^ color[y];
        break;
      }
      if (val[y] == val[x]) xx = y;
    }
    if (color[x] == -1) {
      assert(xx != -1);
      color[x] = 0;
      color[xx] = 1;
    }
  }
  for (int i = 0; i < (n); i++)
    if (color[i] == 0)
      cout << "B";
    else
      cout << "W";
  cout << "\n";
  for (int i = 0; i < (m); i++) cout << max(val[x1[i]], val[x2[i]]) << "\n";
}
