#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 87;
const ll inf = 1e18;
int c[N];
vector<int> g[N];
bool vis[N];
int pa[N];
void dfs(int u)
{
    vis[u] = 1;
    for (int v : g[u])
        if (!vis[v]) {
            pa[v] = u;
            dfs(v);
        }
}
void solve()
{
    int n, m, a, b;
    cin >> n >> m >> a >> b;
    for (int i = 1; i <= n; ++i)
        g[i].clear();
    for (int i = 1; i <= n; ++i) {
        int pi;
        cin >> pi >> c[i];
        if (pi)
            g[pi].push_back(i), g[i].push_back(pi);
    }
    fill_n(vis, n + 1, 0);
    dfs(a);
    vector<int> path;
    for (int i = b; i != a; i = pa[i])
        path.push_back(i);
    reverse(path.begin(), path.end());
    fill_n(vis, n + 1, 0);
    vis[a] = 1;
    for (int u : path)
        vis[u] = 1;
    int delta = 0;
    deque<pair<int, ll>> dk = {{m, 0}};
    for (int u : path) {
        delta -= 1;
        while (dk.size() && dk[0].first + delta < 0)
            dk.pop_front();
        vector<int> qu = {u}, nq, co;
        for (int k = 0; qu.size(); ++k) {
            co.push_back(0);
            nq.clear();
            for (int x : qu) {
                if (co.back() == 0)
                    co.back() = c[x];
                else if (c[x])
                    co.back() = min(co.back(), c[x]);
                for (int y : g[x])
                    if (!vis[y]) {
                        vis[y] = 1;
                        nq.push_back(y);
                    }
            }
            swap(qu, nq);
        }
        co.resize(min(m + 1, (int)co.size()));
        vector<pair<int, ll>> v1, v2;
        for (int k = 0, i = 0; k < co.size(); ++k) {
            while (i < dk.size() && dk[i].first + delta < k)
                ++i;
            if (i == dk.size())
                break;
            if (co[k])
                v1.emplace_back(m - k - delta, co[k] + dk[i].second);
        }
        if (v1.empty())
            continue;
        while (dk.size() && dk.back().first >= v1.back().first) {
            v2.push_back(dk.back());
            dk.pop_back();
        }
        auto pb = [&] (pair<int, ll> p) {
            while (dk.size() && dk.back().second >= p.second)
                dk.pop_back();
            if (dk.empty() || dk.back().first < p.first)
                dk.push_back(p);
        };
        while (v1.size() && v2.size()) {
            if (v1.back().first < v2.back().first)
                pb(v1.back()), v1.pop_back();
            else
                pb(v2.back()), v2.pop_back();
        }
        while (v1.size())
            pb(v1.back()), v1.pop_back();
        while (v2.size())
            pb(v2.back()), v2.pop_back();
    }
    ll ans = dk.size() ? dk[0].second : inf;
    if (ans >= inf)
        cout << "-1\n";
    else
        cout << ans << '\n';
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T;
    cin >> T;
    for (int i = 1; i <= T; ++i) {
        cout << "Case #" << i << ": ";
        solve();
    }
}
