#include<cstdio>
#include<algorithm>
#include<vector>
#include<cmath>
#include<queue>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
// http://acm.hdu.edu.cn/showproblem.php?pid=3440
const int MAXN = 1005;
const int INF = 1000000010;
struct node
{
int v, next;
int w;
}ee[MAXN*MAXN];
int head[MAXN], ne;
int n, dis[MAXN], dd;
bool vis[MAXN], instk[MAXN];
void add(int u, int v, int w)
{
ee[ne].v = v; ee[ne].w = w; ee[ne].next = head[u];
head[u] = ne++;
}
bool spfa(int u)
{
if (instk[u]) return 0;
instk[u] = 1;
vis[u] = 1;
for (int i=head[u]; ~i; i=ee[i].next)
{
int v = ee[i].v;
if (dis[v] > dis[u]+ee[i].w)
{
dis[v] = dis[u]+ee[i].w;
if (!spfa(v)) return false;
}
}
instk[u] = 0;
return 1;
}
int judge(int st, int ed)
{
memset(vis, 0, sizeof vis);
memset(instk, 0, sizeof instk);
for (int i = 0; i< n ; ++i) dis[i] = INF;
dis[st] = 0;
for (int i = 0; i< n; ++i)
{
if (!vis[i])
{
if (!spfa(i)) return -1;
}
}
return dis[ed]-dis[st];
}
struct qs
{
int w, id;
bool operator < (const qs & a) const
{
return w < a.w;
}
}da[MAXN];
int solve()
{
for (int i = 0; i< n-1; ++i)
{
int a = da[i].id, b = da[1+i].id;
if (a-b > dd || a-b < -dd) return -1;
if ( a > b) add(b, a, dd);
else add(a, b, dd);
add(i+1, i, -1);
}
if (da[0].id < da[n-1].id)
return judge(da[0].id, da[n-1].id);
else
return judge(da[n-1].id, da[0].id);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
int t, cs = 0;
scanf("%d", &t);
while (t--)
{
printf("Case %d: ", ++cs);
scanf("%d%d", &n, &dd);
memset(head, -1, sizeof head); ne = 0;
for (int i = 0; i< n; ++i)
{
scanf("%d", &da[i].w);
da[i].id = i;
}
sort(da, da+n);
printf("%d\n", solve());
}
return 0;
}