#include <bits/stdc++.h>
using namespace std;
int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = (x << 3) + (x << 1) + (ch ^ 48);
    ch = getchar();
  }
  return x * f;
}
int n, now;
vector<int> ans[2];
struct Tree {
  vector<int> G[200005];
  vector<int> tag[200005 << 2];
  int dep[200005], dfn[200005], dfstime, top[200005], siz[200005],
      vis[200005 << 2], fa[200005], son[200005], sta[200005];
  void dfs1(int x) {
    int Siz = G[x].size();
    siz[x] = 1;
    dep[x] = dep[fa[x]] + 1;
    for (int i = 0; i < Siz; i++) {
      dfs1(G[x][i]);
      siz[x] += siz[G[x][i]];
      if (siz[G[x][i]] > siz[son[x]]) son[x] = G[x][i];
    }
  }
  void dfs2(int x, int fath) {
    top[x] = fath;
    dfn[x] = ++dfstime;
    if (son[x]) dfs2(son[x], fath);
    int Siz = G[x].size();
    for (int i = 0; i < Siz; i++) {
      if (G[x][i] == son[x]) continue;
      dfs2(G[x][i], G[x][i]);
    }
  }
  void modify(int l, int r, int k, int x, int y, int val) {
    if (l >= x && r <= y) {
      tag[k].push_back(val);
      return;
    }
    int mid = (l + r) >> 1;
    if (x <= mid) modify(l, mid, k * 2, x, y, val);
    if (y > mid) modify(mid + 1, r, k * 2 + 1, x, y, val);
  }
  void query(int l, int r, int k, int x) {
    if (!vis[k]) {
      int Siz = tag[k].size();
      for (int i = 0; i < Siz; i++) {
        if (!sta[tag[k][i]]) {
          ans[now].push_back(tag[k][i]);
          sta[tag[k][i]] = 1;
        }
      }
      vis[k] = 1;
    }
    if (l == r) return;
    int mid = (l + r) >> 1;
    if (x <= mid)
      query(l, mid, k * 2, x);
    else
      query(mid + 1, r, k * 2 + 1, x);
  }
  void split(int x, int y, int val) {
    while (top[x] != top[y]) {
      if (dep[top[x]] < dep[top[y]]) swap(x, y);
      modify(1, n, 1, dfn[top[x]], dfn[x], val);
      x = fa[top[x]];
    }
    if (dep[x] > dep[y]) swap(x, y);
    if (x != y) modify(1, n, 1, dfn[x] + 1, dfn[y], val);
  }
} T[2];
int main() {
  n = read();
  for (int i = 2; i <= n; i++)
    T[0].fa[i] = read(), T[0].G[T[0].fa[i]].push_back(i);
  for (int i = 2; i <= n; i++)
    T[1].fa[i] = read(), T[1].G[T[1].fa[i]].push_back(i);
  T[0].dfs1(1);
  T[0].dfs2(1, 1);
  T[1].dfs1(1);
  T[1].dfs2(1, 1);
  for (int i = 2; i <= n; i++) {
    T[0].split(T[1].fa[i], i, i);
    T[1].split(T[0].fa[i], i, i);
  }
  now = 1;
  int x = read();
  printf("Blue\n%d\n", x);
  ans[0].push_back(x + 1);
  T[1].sta[x + 1] = 1;
  while (1) {
    ans[now].clear();
    int Siz = ans[now ^ 1].size();
    for (int i = 0; i < Siz; i++)
      T[now ^ 1].query(1, n, 1, T[now ^ 1].dfn[ans[now ^ 1][i]]);
    sort(ans[now].begin(), ans[now].end());
    Siz = ans[now].size();
    if (Siz == 0) break;
    puts(now ? "Red" : "Blue");
    for (int i = 0; i < Siz; i++) printf("%d ", ans[now][i] - 1);
    puts("");
    now ^= 1;
  }
  return 0;
}
