#include <cstdio>
#define maxn 100010
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int col[maxn<<2];//标记数组,提升效率
int sum[maxn<<2];//记录数组,储存每个区间段的和
int t,n,cmd;
void pushup(int rt)
{
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void pushdown(int rt,int l)//l为该节点的区间长度
{
if(col[rt])//若该节点标记不为0,将该标记值往下传
{
col[rt<<1]=col[rt<<1|1]=col[rt];//传值
sum[rt<<1]=(l-(l>>1))*col[rt];//改变该节点维护的和(左子树的长度为l-l/2,所以其和为(l-l/2)*col[rt])
sum[rt<<1|1]=(l>>1)*col[rt];
col[rt]=0;//重置标记
}
}
void build(int l,int r,int rt)
{
col[rt]=0;//初始化为0
sum[rt]=1;//初始化为1
if(l==r)return;
int m=(l+r)>>1;//以中点为界限,继续建子树,直到叶节点
build(lson);
build(rson);
pushup(rt);//回溯,更新每个子节点维护的区间的和,因为一开始都被初始化为1了
}
void update(int L,int R,int x,int l,int r,int rt)
{
if(L<=l&&R>=r)
{
col[rt]=x;//若找到子集,则直接将节点的标记等于要替换的值x
sum[rt]=x*(r-l+1);//更新该节点所维护的和
return;//可直接返回,无需继续向下更新,因为维护的是和
}
pushdown(rt,r-l+1);//没找到子集的情况下,将标记向下更新
int m=(l+r)>>1;
if(L<=m)update(L,R,x,lson);
if(R>m)update(L,R,x,rson);
pushup(rt);//每次更新都要向上更新子节点所维护区间的和
}
int main()
{
int L,R,x,i;
scanf("%d",&t);
for(i=1;i<=t;i++)
{
scanf("%d",&n);
build(1,n,1);
scanf("%d",&cmd);
while(cmd--)
{
scanf("%d%d%d",&L,&R,&x);
update(L,R,x,1,n,1);
}
printf("Case %d: The total value of the hook is %d.\n",i,sum[1]);//sum[1]记录的就是整个区间的和;
}
return 0;
}