#include <cstdio>
#include <vector>
#include <queue>
#include <utility>
#include <algorithm>
using namespace std;
vector<int> e[100010];
int u[200010], v[200010], w[200010], d[100010];
char c[100010];
int fi[100010], nw;
pair<int, int> p[100010];
int dfs(int x) {
	int res = 0;
	for (int i = 0; i < e[x].size(); i++) {
		int z = e[x][i], y = u[z] + v[z] - x;
		if (!fi[y] || c[y]) continue;
		c[y] = 3 - c[x];
		w[z] = nw;
		dfs(y);
		res = 1;
	}
	return res;
}
int main() {
	int n, m;
	scanf("%d%d", &n, &m);
	for (int i = 0; i < n; i++) {
		scanf("%d", &d[i]);
	}
	for (int i = 0; i < m; i++) {
		scanf("%d%d", &u[i], &v[i]);
		--u[i]; --v[i];
		e[u[i]].push_back(i);
		e[v[i]].push_back(i);
	}
	for (int i = 0; i < n; i++) {
		p[i] = make_pair(d[i], i);
	}
	sort(p, p + n);
	int st = 0;
	while (st < n) {
		int ed = st;
		while (ed < n && p[st].first == p[ed].first) {
			fi[p[ed].second] = 1;
			ed++;
		}
		nw = p[st].first;
		for (int i = st; i < ed; i++) {
			int x = p[i].second;
			if (c[x]) continue;
			for (int j = 0; j < e[x].size(); j++) {
				int z = e[x][j], y = u[z] + v[z] - x;
				if (c[y]) {
					c[x] = 3 - c[y];
					w[z] = nw;
					dfs(x);
					break;
				}
			}
		}
		for (int i = st; i < ed; i++) {
			int x = p[i].second;
			if (c[x]) continue;
			c[x] = 1;
			if (!dfs(x)) {
				puts("-1");
				return 0;
			}
		}
		st = ed;
	}
	for (int i = 0; i < n; i++) {
		c[i] = c[i] == 1 ? 'B' : 'W';
	}
	puts(c);
	for (int i = 0; i < m; i++) {
		if (!w[i]) w[i] = 1000000000;
		printf("%d\n", w[i]);
	}
	return 0;
}
