小紫每次可以移动1或者2,我们可以认为他每次移动2次,然后记录每个点最早被小紫访问时间,这个点可以被小红访问只有两种情况,
1,不是叶子节点,那么小紫到达时间必须严格晚于小红;
2,是叶子节点,那么小紫到达时间晚于或等于小红;(因为小红到达了就结束了)
注意,在实现的时候,可以bfs小紫,然后dis 除2向上取整
#include <bits/stdc++.h>
using namespace std;
#define int long long
constexpr int MOD = 998244353, INF = 1e18;
void solve()
{
    int n, a, b;
    cin >> n >> a >> b;
    vector adj(n + 1, vector<int>());
    for (int i = 0, u, v; i < n - 1; i++)
    {
        cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    vector<int> dist1(n + 1, INF);
    dist1[b] = 0;
    queue<int> q;
    q.push(b);
    while (q.size())
    {
        auto u = q.front();
        q.pop();
        for (auto v: adj[u])
        {
            if (dist1[v] == INF)
            {
                dist1[v] = dist1[u] + 1;
                q.push(v);
            }
        }
    }
    for (int i = 1; i <= n; i++)
    {
        dist1[i] = (dist1[i] + 1) / 2;
    }
    vector<int> dist2(n + 1, INF);
    dist2[a] = 0;
    q.push(a);
    while (q.size())
    {
        auto u = q.front();
        q.pop();
        int timer = dist2[u] + 1;
        for (auto v: adj[u])
        {
            if ((dist2[v] == INF) && (dist1[v] > timer || (dist1[v] == timer && (adj[v].size() == 1))))
            {
                dist2[v] = dist2[u] + 1;
                q.push(v);
            }
        }
    }
    for (int i = 1;i <= n;i++)
    {
        if (adj[i].size() == 1)
        {
            if (dist2[i] != INF)
            {
                cout << "red\n";
                return;
            }
        }
    }
    cout << "purple\n";
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int testcase = 1;
    cin >> testcase;
    while (testcase--)
    {
        solve();
    }
    return 0;
}