#include <bits/stdc++.h>
using namespace std;
const double pi = acos(-1);
int n, cnt;
struct Tree {
  vector<int> E[210000], e1;
  vector<pair<int, int> > TMP[210000 * 4];
  int dfn[210000], tim, dfn2[210000];
  list<pair<int, int> > S[210000 * 4];
  bool use[210000];
  void add(int p, int l, int r, int x, int y, int v) {
    if (l == r) {
      TMP[p].push_back(make_pair(y, v));
      return;
    }
    int mid = (l + r) / 2;
    if (x <= mid)
      add(p * 2, l, mid, x, y, v);
    else
      add(p * 2 + 1, mid + 1, r, x, y, v);
  }
  void build_tree(int p, int l, int r) {
    if (l == r) {
      sort(TMP[p].begin(), TMP[p].end());
      for (auto i : TMP[p]) S[p].push_back(i);
      return;
    }
    int mid = (l + r) / 2;
    build_tree(p * 2, l, mid);
    build_tree(p * 2 + 1, mid + 1, r);
    merge(S[p * 2].begin(), S[p * 2].end(), S[p * 2 + 1].begin(),
          S[p * 2 + 1].end(), back_inserter(S[p]));
  }
  void dfs(int x, int ff) {
    dfn[x] = ++tim;
    for (int i = 0; i < E[x].size(); ++i)
      if (E[x][i] != ff) dfs(E[x][i], x);
    dfn2[x] = tim;
  }
  void build(vector<int> e1_, vector<int> e2) {
    e1 = e1_;
    for (int i = 2; i <= n; ++i)
      E[e1[i - 2]].push_back(i), E[i].push_back(e1[i - 2]);
    dfs(1, 0);
    for (int i = 0; i <= n - 2; ++i) {
      int x = dfn[e2[i]], y = dfn[i + 2];
      if (x > y) swap(x, y);
      add(1, 1, n, x, y, i);
      add(1, 1, n, y, x, i);
    }
    build_tree(1, 1, n);
  }
  void Find(int p, int l, int r, int x, int y, vector<int>& tmp) {
    if (x <= l && y >= r) {
      while (!S[p].empty() && S[p].front().first < x) {
        auto v = S[p].front();
        if (!use[v.second]) {
          use[v.second] = 1;
          tmp.push_back(v.second);
        }
        S[p].pop_front();
      }
      while (!S[p].empty() && S[p].back().first > y) {
        auto v = S[p].back();
        if (!use[v.second]) {
          use[v.second] = 1;
          tmp.push_back(v.second);
        }
        S[p].pop_back();
      }
      return;
    }
    int mid = (l + r) / 2;
    if (x <= mid) Find(p * 2, l, mid, x, y, tmp);
    if (y > mid) Find(p * 2 + 1, mid + 1, r, x, y, tmp);
  }
  vector<int> work(vector<int> tmp) {
    int m = tmp.size();
    vector<int> get;
    for (int i = 0; i <= m - 1; ++i) {
      int x = e1[tmp[i]], y = tmp[i] + 2;
      if (dfn[x] > dfn[y]) swap(x, y);
      int l = dfn[y], r = dfn2[y];
      Find(1, 1, n, l, r, get);
    }
    return get;
  }
} T1, T2;
vector<int> E1, E2, tmp;
int main() {
  scanf("%d", &n);
  int x;
  for (int i = 1; i <= n - 1; ++i) scanf("%d", &x), E1.push_back(x);
  for (int i = 1; i <= n - 1; ++i) scanf("%d", &x), E2.push_back(x);
  T1.build(E1, E2);
  T2.build(E2, E1);
  int idx;
  scanf("%d", &idx);
  idx--;
  T2.use[idx] = 1;
  tmp.push_back(idx);
  bool flag = 0;
  for (;;) {
    if (!flag)
      printf("Blue\n");
    else
      printf("Red\n");
    sort(tmp.begin(), tmp.end());
    for (int i = 0; i < tmp.size(); ++i) printf("%d ", tmp[i] + 1);
    puts("");
    if (!flag)
      tmp = T1.work(tmp);
    else
      tmp = T2.work(tmp);
    if (tmp.empty()) break;
    flag ^= 1;
  }
}
