#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

int d[100000];
int u[200000];
int v[200000];
int par[200000];
int cnt[200000];
int ans[200000];

int find(int x) {
    if (par[x] == x) {
        return x;
    } else {
        return par[x] = find(par[x]);
    }
}

void unite(int x, int y) {
    x = find(x);
    y = find(y);
    
    if (x == y) return;
    
    par[x] = y;
    cnt[y] += cnt[x];
}

int main() {
    int n, m, i;
    vector <pair <int, int>> w;
    
    scanf("%d %d", &n, &m);
    
    for (i = 0; i < n; i++) scanf("%d", &d[i]);
    
    for (i = 0; i < m; i++) {
        scanf("%d %d", &u[i], &v[i]);
        
        u[i]--;
        v[i]--;
        
        w.push_back(make_pair(max(d[u[i]], d[v[i]]), i));
    }
    
    sort(w.begin(), w.end());
    
    for (i = 0; i < n * 2; i++) {
        cnt[i] = 1;
        par[i] = i;
    }
    
    for (i = 0; i < w.size(); i++) {
        int c = w[i].first;
        int p = w[i].second;
        int x = u[p];
        int y = v[p];
        
        if (find(x) == find(y) || find(x) == find(y + n)) {
            ans[p] = 1e9;
            
            continue;
        }
        
        if (cnt[find(x)] == 1 && cnt[find(y)] == 1) {
            if (d[x] != d[y]) {
                puts("-1");
                
                return 0;
            }
        }
        
        ans[p] = c;
        
        unite(x, y + n);
        unite(x + n, y);
    }
    
    for (i = 0; i < n; i++) {
        if (find(i) == find(0)) {
            putchar('B');
        } else {
            putchar('W');
        }
    }
    puts("");
    
    for (i = 0; i < m; i++) printf("%d\n", ans[i]);
    
    return 0;
}
