#include <iostream>
#include <cstdio>
#include <vector>
#include <set>
#include <deque>
#include <algorithm>
#include <queue>
#include <cmath>
#include <map>
#include <complex>
#include <cstring>
#include <cfloat>
#include <iomanip>
#include <stack>
#include <bitset>
 
 
using namespace std;
#define rep(i, a, b) for(int i = (a); i < (b); i++)
#define repd(i, a, b) for(int i = (a); i > (b); i--)
#define forIt(it, a) for(__typeof((a).begin()) it = (a).begin(); it != (a).end(); it++)
#define forRev(it, a) for(__typeof((a).rbegin()) it = (a).rbegin(); it != (a).rend(); it++)
#define ft(a) __typeof((a).begin())
#define ll long long
#define ld long double
#define fi first
#define se second
#define mk make_pair
#define pb push_back
#define sz(a) (int)(a).size()
#define all(a) (a).begin(), (a).end()
#define Rep(i,n) for(int i = 0; i < (n); ++i)
#define bitcount(n) __builtin_popcountll(n)
#define pii pair<int, int>
 
 
typedef complex<ld> cplex;
typedef vector<int> vi;
typedef pair<int, int> ii;
typedef pair<ii, int> iii;
typedef vector<ii> vii;
typedef vector<iii> viii;
 
const int N = 1000000 + 8;
const int M = 1500 + 7;
const int inf = 1e9 + 7;
const long long linf = 1ll * inf * (inf - 1);
const double pi = acos(-1);
const double eps = 1e-6;
const bool multipleTest = true;
 
 
ll L[N];
int a[N], b[N], cost[N];
int id[N];
 
bool cmp(int u, int v) {
    if (cost[u] != cost[v]) return cost[u] < cost[v];
    return mk(a[u], b[u]) < mk(a[v], b[v]);
}
 
int n, m, D;
 
ll q[N]; int top, bot;
 
void solve() {
    cin >> n >> m >> D;
    for(int i = 0; i < n; ++i) {
        scanf("%d%d%d", a + i, b + i, cost + i);
        id[i] = i;
    }
    sort(id, id + n, cmp);
 
    L[0] = 0;
    for(int i = 1; i <= D; ++i) L[i] = linf;
 
    top = 0, bot = 0;
 
    for(int i = 0; i < n; ++i) {
        int u = id[i];
 
        top = bot = 0;
        int last = D;
 
        for(int j = D; j >= a[u]; --j) {
            while (top < bot && q[top] > j - a[u]) ++top;
            last = min(last, j - a[u]);
            while (last >= max(0, j - b[u])) {
                while (top < bot && L[q[bot - 1]] >= L[last]) bot--;
                q[bot++] = last--;
            }
            L[j] = min(L[j], L[q[top]] + cost[u]);
        }
    }
 
//    for(int j = 0; j <= D; ++j) {
//        cout << L[j] << ' ';
//    }
//    puts("");
 
    if (L[D] <= m) printf("%lld\n", L[D]);
    else puts("IMPOSSIBLE");
 
}
 
 
 
int main() {
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    clock_t t1 = clock();
#endif
    //        createTest();
    //        return 0;
        freopen("out.txt", "w", stdout);
 
 
 
 
    int Test = 1;
    if (multipleTest) {
        cin >> Test;
    }
 
    for(int i = 0; i < Test; ++i) {
                printf("Case #%d: ", i + 1);
        solve();
    }
    //
#ifndef ONLINE_JUDGE
//    cout<<"\n" << 1.0 * (clock() - t1) / CLOCKS_PER_SEC<<endl;
#endif
 
}