#include <bits/stdc++.h>
using namespace std;
int n, CNT, now;
vector<int> todel[2];
struct tree {
  struct Point {
    int top, fa, size, depth, son, id;
  } point[200100];
  struct Edge {
    int to, nxt;
  } edge[200100];
  int head[200100], cnt, idx, d[200100], vis[800100];
  vector<int> tag[800100];
  inline void addedge(int x, int y) {
    edge[++cnt].to = y;
    edge[cnt].nxt = head[x];
    head[x] = cnt;
  }
  inline void dfs1(int x) {
    point[x].size = 1;
    point[x].depth = point[point[x].fa].depth + 1;
    for (int i = head[x]; i; i = edge[i].nxt) {
      int upup = edge[i].to;
      dfs1(upup);
      point[x].size += point[upup].size;
      if (point[point[x].son].size < point[upup].size) point[x].son = upup;
    }
  }
  inline void dfs2(int x, int top) {
    point[x].top = top;
    point[x].id = ++idx;
    if (point[x].son) dfs2(point[x].son, top);
    for (int i = head[x]; i; i = edge[i].nxt) {
      int upup = edge[i].to;
      if (upup == point[x].son) continue;
      dfs2(upup, upup);
    }
  }
  inline void modify(int t, int l, int r, int L, int R, int val) {
    if (l > R || L > r) return;
    if (L <= l && r <= R) {
      tag[t].push_back(val);
      return;
    }
    int mid = (l + r) / 2;
    modify(t * 2, l, mid, L, R, val);
    modify(t * 2 + 1, mid + 1, r, L, R, val);
  }
  inline void del(int t, int l, int r, int val) {
    if (!vis[t]) {
      for (auto x : tag[t])
        if (!d[x]) CNT++, todel[now].push_back(x), d[x] = 1;
      vis[t] = 1;
    }
    if (l == r) return;
    int mid = (l + r) / 2;
    if (val <= mid)
      del(t * 2, l, mid, val);
    else
      del(t * 2 + 1, mid + 1, r, val);
  }
  inline void modify(int x, int y, int v) {
    while (point[x].top != point[y].top) {
      if (point[point[x].top].depth < point[point[y].top].depth) swap(x, y);
      modify(1, 1, n, point[point[x].top].id, point[x].id, v);
      x = point[point[x].top].fa;
    }
    if (point[x].depth > point[y].depth) swap(x, y);
    if (point[x].depth < point[y].depth)
      modify(1, 1, n, point[x].id + 1, point[y].id, v);
  }
  inline void pre() {
    for (int i = 2; i <= n; i++) {
      scanf("%d", &point[i].fa);
      addedge(point[i].fa, i);
    }
    dfs1(1);
    dfs2(1, 1);
  }
} T[2];
int main() {
  scanf("%d", &n);
  T[0].pre(), T[1].pre();
  for (int i = 2; i <= n; i++) {
    T[1].modify(i, T[0].point[i].fa, i);
    T[0].modify(i, T[1].point[i].fa, i);
  }
  int x;
  scanf("%d", &x);
  printf("Blue\n%d\n", x);
  T[1].d[x + 1] = 1;
  todel[0].push_back(x + 1);
  for (int i = 1; i <= 2 * (n - 1); i++) {
    now = i & 1;
    CNT = 0;
    todel[now].clear();
    for (auto j : todel[now ^ 1])
      T[now ^ 1].del(1, 1, n, T[now ^ 1].point[j].id);
    if (!CNT) break;
    sort(todel[now].begin(), todel[now].end());
    puts(now ? "Red" : "Blue");
    for (auto j : todel[now]) printf("%d ", j - 1);
    puts("");
  }
}
