#include <bits/stdc++.h>
using namespace std;
struct Edge { int u, v; };
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
if (!(cin >> n >> m)) return 0;
vector<Edge> E(m+1);
vector<vector<pair<int,int>>> g(n+1); // (to, edge_id)
for (int i = 1; i <= m; ++i) {
int a, b; cin >> a >> b;
E[i] = {a, b};
g[a].push_back({b, i});
g[b].push_back({a, i});
}
int p;
cin >> p;
vector<pair<int,int>> req(p);
for (int i = 0; i < p; ++i) cin >> req[i].first >> req[i].second;
// -------- Tarjan: tìm cầu --------
vector<int> tin(n+1, 0), low(n+1, 0);
vector<char> isBridge(m+1, 0);
int timer = 0;
function<void(int,int)> dfs_bridge = [&](int u, int pe) {
tin[u] = low[u] = ++timer;
for (auto [v, id] : g[u]) {
if (id == pe) continue;
if (!tin[v]) {
dfs_bridge(v, id);
low[u] = min(low[u], low[v]);
if (low[v] > tin[u]) isBridge[id] = 1;
} else {
low[u] = min(low[u], tin[v]);
}
}
};
for (int i = 1; i <= n; ++i) if (!tin[i]) dfs_bridge(i, -1);
// -------- Nén theo cạnh không phải cầu --------
vector<int> comp(n+1, -1);
int C = 0;
function<void(int)> dfs_comp = [&](int u) {
comp[u] = C;
for (auto [v, id] : g[u]) {
if (isBridge[id] || comp[v] != -1) continue;
dfs_comp(v);
}
};
for (int i = 1; i <= n; ++i) if (comp[i] == -1) { ++C; dfs_comp(i); }
// -------- Xây cây cầu (bridge-tree) --------
vector<vector<pair<int,int>>> tree(C+1); // (toComp, edge_id original)
for (int id = 1; id <= m; ++id) if (isBridge[id]) {
int a = comp[E[id].u], b = comp[E[id].v];
if (a == b) continue; // an toàn
tree[a].push_back({b, id});
tree[b].push_back({a, id});
}
// -------- Hiệu tuyến từ các yêu cầu x->y --------
vector<long long> sum(C+1, 0);
for (auto [x, y] : req) {
sum[comp[x]] += 1;
sum[comp[y]] -= 1;
}
// -------- DFS cộng dồn & gán hướng cho các cầu --------
vector<char> ans(m+1, 'B'); // mặc định: cạnh trong chu trình -> 'B'
vector<char> vis(C+1, 0);
function<void(int,int)> dfs_tree = [&](int u, int parentEdge) {
vis[u] = 1;
for (auto [v, id] : tree[u]) {
if (id == parentEdge) continue;
if (!vis[v]) {
dfs_tree(v, id);
// Sau khi duyệt con v, quyết định hướng cho cầu id
long long s = sum[v]; // tổng "luồng" cần đi qua cầu từ v lên u
int cu = comp[E[id].u], cv = comp[E[id].v]; // comp của đầu mút theo cạnh gốc
if (s > 0) {
// cần hướng v -> u
if (cu == v && cv == u) ans[id] = 'L'; // a_i -> b_ielse if (cu == u && cv == v) ans[id] = 'R'; // b_i -> a_i
else ans[id] = 'B'; // đề phòng (không xảy ra)
} else if (s < 0) {
// cần hướng u -> v
if (cu == u && cv == v) ans[id] = 'L';
else if (cu == v && cv == u) ans[id] = 'R';
else ans[id] = 'B';
} else {
ans[id] = 'B'; // không bị ràng buộc
}
sum[u] += sum[v];
}
}
};
for (int i = 1; i <= C; ++i) if (!vis[i]) dfs_tree(i, -1);
// -------- In kết quả theo thứ tự cạnh 1..m --------
string out; out.resize(m);
for (int i = 1; i <= m; ++i) {
if (!isBridge[i]) out[i-1] = 'B';
else out[i-1] = ans[i];
}
cout << out << '\n';
return 0;
}