#include <bits/stdc++.h> //该方法容易超时
using namespace std;
const int N=2050;
const int M=2500000;
const int INF=0x3f3f3f3f;
int s,t,cnt,n,m;
int head[N],nxt[M],cap[M],level[N],cur[N];//head表头,nxt指向下个边,cap边的容量,level点的层次,cur当前弧优化
int v[M];//边所指的点
void add_one_edge(int from,int to,int Cap){
cnt++;
nxt[cnt]=head[from];
head[from]=cnt;
v[cnt]=to;
cap[cnt]=Cap;
}
void add_edge(int from,int to,int Cap){
add_one_edge(from,to,Cap);
add_one_edge(to,from,0);
}
int bfs(){
queue<int>q;
memset(level,0,sizeof(level));
level[s]=1;
q.push(s);
while(q.size()){
int u=q.front(); q.pop();
for(int i=head[u];i!=-1;i=nxt[i]){
if((level[v[i]]==0)&&(cap[i]>0)){
level[v[i]]=level[u]+1;
q.push(v[i]);
}
}
}
//return (level[t]!=0);
if(level[t]>0) return 1;
else return 0;
}
int dfs(int u,int flow){
if(u==t) return flow;
for(int &i=cur[u];i!=-1;i=nxt[i]){
if((level[v[i]]==level[u]+1)&&cap[i]!=0){
int d=dfs(v[i],min(flow,cap[i]));
if(d>0){
cap[i]-=d;
cap[i^1]+=d;
return d;
}
}
}
return 0;
}
int max_flow(){
int flow=0;
while(bfs()){
for(int i=1;i<=n;i++) cur[i]=head[i];
while(int f=dfs(s,INF)) flow+=f;
}
return flow;
}
int main(){
int T,a,b,c;
//cin>>T;
scanf("%d",&T);
int k=1;
while(T--){
scanf("%d %d",&n,&m);//cin>>n>>m;
s=1,t=n;
memset(head,-1,sizeof(head));
memset(nxt,-1,sizeof(nxt));
cnt=-1;
for(int i=0;i<m;i++){
cin>>a>>b>>c;
add_edge(a,b,c);
}
printf("Case %d: %d\n",k++,max_flow());
//cout<<"Case "<<k++<<": "<<max_flow()<<endl;
}
return 0;
}