//单调队列优化
//dist[i]表示i与(0,0)的距离, sum[i]表示从0->1->2->...i所走的距离, sw[i]表示∑w[j](j = 0, 1,...i),
//table[i] = min(table[j]+dist[j+1]+dist[i]+sum[i]-sum[j]) (j < i && sw[i]-sw[j] <= C)
//不难看出可以使用单调队列进行优化(其实我对单调队列使用的情况也不是很明确,直观上看出来的==!)
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <queue>
#include <algorithm>
#include <vector>
#include <cstring>
#include <stack>
#include <cctype>
#include <utility>
#include <map>
#include <string>
#include <climits>
#include <set>
#include <string>
#include <sstream>
#include <utility>
#include <ctime>
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using std::priority_queue;
using std::vector;
using std::swap;
using std::stack;
using std::sort;
using std::max;
using std::min;
using std::pair;
using std::map;
using std::string;
using std::cin;
using std::cout;
using std::set;
using std::queue;
using std::string;
using std::istringstream;
using std::getline;
using std::make_pair;
using std::greater;
const int MAXN(100010);
int dist[MAXN], sum[MAXN];
int x[MAXN], y[MAXN], sw[MAXN];
int que[MAXN], value[MAXN];
int front, rear;
inline int fun(int i)
{
return value[i]+dist[i+1]-sum[i+1];
}
int main()
{
int T, n_case(0);
scanf("%d", &T);
while(T--)
{
int n, C;
scanf("%d%d", &C, &n);
for(int i = 1; i <= n; ++i)
{
scanf("%d%d%d", x+i, y+i, sw+i);
dist[i] = abs(x[i])+abs(y[i]);
sum[i] = sum[i-1]+abs(x[i]-x[i-1])+abs(y[i]-y[i-1]);
sw[i] += sw[i-1];
}
value[0] = 0;
front = rear = 0;
for(int i = 1; i <= n; ++i)
{
while(front <= rear && (sw[i]-sw[que[front]]) > C)
++front;
value[i] = fun(que[front])+dist[i]+sum[i];
while(front <= rear && fun(i) <= fun(que[rear]))
--rear;
que[++rear] = i;
}
printf("Case %d: %d\n", ++n_case, value[n]);
}
return 0;
}