/* -*- coding: utf-8 -*- * * 3056.cc: No.3056 Disconnected Coloring - yukicoder */ #include #include #include #include #include using namespace std; /* constant */ const int MAX_N = 200000; const int MAX_M = 200000; const char ecs[] = "BR"; enum { B, R }; /* typedef */ using qi = queue; using pii = pair; using vpii = vector; /* global variables */ vpii nbrs[MAX_N], rnbrs[MAX_N]; int ds[MAX_N], es[MAX_M]; /* subroutines */ /* main */ int main() { int n, m; scanf("%d%d", &n, &m); if (m & 1) { puts("-1"); return 0; } for (int i = 0; i < m; i++) { int u, v; scanf("%d%d", &u, &v); u--, v--; if (u == 0 && v == n - 1) { puts("-1"); return 0; } nbrs[u].push_back({v, i}); nbrs[v].push_back({u, i}); } fill(ds, ds + n, -1); ds[0] = 0; qi q; q.push(0); while (! q.empty()) { int u = q.front(); q.pop(); if (u == n - 1) continue; for (auto [v, ei]: nbrs[u]) { rnbrs[v].push_back({u, ei}); if (ds[v] < 0) { ds[v] = ds[u] + 1; q.push(v); } } } fill(es, es + m, -1); fill(ds, ds + n, -1); ds[n - 1] = 0; q.push(n - 1); int cb = 0, cr = 0; while (! q.empty()) { int u = q.front(); q.pop(); if (u == 0) continue; for (auto [v, ei]: rnbrs[u]) { if (u == n - 1) es[ei] = R, cr++; if (v == 0) es[ei] = B, cb++; if (ds[v] < 0) { ds[v] = ds[u] + 1; q.push(v); } } } int hm = m / 2; for (int i = 0; i < m; i++) if (es[i] < 0) { if (cb < hm) es[i] = B, cb++; else if (cr < hm) es[i] = R, cr++; } //for (int i = 0; i < m; i++) printf(" %d", es[i]); putchar('\n'); for (int i = 0; i < m; i++) putchar(ecs[es[i]]); putchar('\n'); return 0; }