#include using namespace std; using std::cerr; using std::cin; using std::cout; #if __has_include() #include using mint = atcoder::modint1000000007; istream &operator>>(istream &is, mint &a) { int t; is >> t; a = t; return is; } ostream &operator<<(ostream &os, mint a) { return os << a.val(); } #endif #undef long #define long long long #define uint unsigned int #define ull unsigned long #define overload3(a, b, c, name, ...) name #define rep3(i, a, b) for (int i = (a); i < (b); i++) #define rep2(i, n) rep3(i, 0, n) #define rep1(n) rep2(i, n) #define rep(...) overload3(__VA_ARGS__, rep3, rep2, rep1)(__VA_ARGS__) #define per3(i, a, b) for (int i = (b) - 1; i >= (a); i--) #define per2(i, n) per3(i, 0, n) #define per1(n) per2(i, n) #define per(...) overload3(__VA_ARGS__, per3, per2, per1)(__VA_ARGS__) #define ALL(a) a.begin(), a.end() #define UNIQUE(a) \ sort(ALL(a)); \ a.erase(unique(ALL(a)), a.end()) #define SZ(a) (int)a.size() #define vec vector #ifndef DEBUG #define cerr \ if (false) \ cerr #undef assert #define assert(...) void(0) #undef endl #define endl '\n' #endif template ostream &operator<<(ostream &os, vector a) { const int n = a.size(); rep(i, n) { os << a[i]; if (i + 1 != n) os << " "; } return os; } template ostream &operator<<(ostream &os, array a) { rep(i, n) { os << a[i]; if (i + 1 != n) os << " "; } return os; } template istream &operator>>(istream &is, vector &a) { for (T &i : a) is >> i; return is; } template bool chmin(T &x, S y) { if ((T)y < x) { x = (T)y; return true; } return false; } template bool chmax(T &x, S y) { if (x < (T)y) { x = (T)y; return true; } return false; } template void operator++(vector &a) { for (T &i : a) ++i; } template void operator--(vector &a) { for (T &i : a) --i; } template void operator++(vector &a, int) { for (T &i : a) i++; } template void operator--(vector &a, int) { for (T &i : a) i--; } void solve() { int n, m; cin >> n >> m; vec>> g(n); rep(i, m) { int u, v; cin >> u >> v; u--, v--; g[u].emplace_back(v, i); g[v].emplace_back(u, i); } vec du(n, n), dv(n, n); queue q; du[0] = 0; q.push(0); while (!q.empty()) { int x = q.front(); q.pop(); for (auto [i, idx] : g[x]) { if (du[i] != n) continue; du[i] = du[x] + 1; q.push(i); } } dv[n - 1] = 0; q.push(n - 1); while (!q.empty()) { int x = q.front(); q.pop(); for (auto [i, idx] : g[x]) { if (dv[i] != n) continue; dv[i] = dv[x] + 1; q.push(i); } } int c1 = 0, c2 = 0; vec ans(m); for (auto [to, idx] : g[0]) { if (dv[0] == dv[to] + 1) { ans[idx] = 1; c1++; } } for (auto [to, idx] : g[n - 1]) { if (du[n - 1] == du[to] + 1) { ans[idx] = -1; c2++; } } rep(i, m) { if (ans[i] != 0) continue; if (2 * c1 < m) { ans[i] = 1; c1++; } else if (2 * c2 < m) { ans[i] = -1; c2++; } } if (c1 != c2) { cout << -1 << endl; return; } stringstream s; rep(i, m) { if (ans[i] == 1) s << 'R'; if (ans[i] == -1) s << 'B'; } string ss = s.str(); if (ss.size() != m) { cout << -1 << endl; return; } cout << ss << endl; return; } int main() { // srand((unsigned)time(NULL)); cin.tie(nullptr); ios::sync_with_stdio(false); cout << fixed << setprecision(20); int t = 1; // cin >> t; while (t--) solve(); }