#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <functional>
using namespace std;
typedef pair<int, int> P;
const int INF = 0x3f3f3f3f;
const int maxn = 1e4 + 10;
int T, n, cnt, ans, d[maxn], vis[maxn];
struct Edge {
int u, v, cost;
}edge[maxn];
vector<P> G[maxn];
map<P, int> m;
void init() {
cnt = 0; ans = INF;
for (int i = 0; i < maxn; i++) {
G[i].clear();
}
m.clear();
}
void dijkstra(int s, int e, int x) {
for (int i = 0; i < maxn; i++) {
d[i] = INF;
vis[i] = 0;
}
d[s] = 0;
priority_queue<P, vector<P>, greater<P> > q;
q.push(make_pair(0, s));
while (!q.empty()) {
P p = q.top(); q.pop();
int u = p.second, dis = p.first;
if (dis + x >= ans) break;
if (vis[u]) continue;
vis[u] = 1;
for (int i = 0; i < G[u].size(); i++) {
int v = G[u][i].first, id = G[u][i].second;
int cost = edge[id].cost;
if (d[v] > d[u] + cost) {
d[v] = d[u] + cost;
q.push(make_pair(d[v], v));
}
}
}
ans = min(ans, d[e] + x);
}
int main() {
scanf("%d", &T);
for (int kase = 1; kase <= T; kase++) {
scanf("%d", &n);
init();
for (int i = 1; i <= n; i++) {
int x1, y1, x2, y2, w;
scanf("%d %d %d %d %d", &x1, &y1, &x2, &y2, &w);
P p1 = make_pair(x1, y1), p2 = make_pair(x2, y2);
if (!m[p1]) m[p1] = ++cnt;
if (!m[p2]) m[p2] = ++cnt;
int u = m[p1], v = m[p2];
G[u].push_back(make_pair(v, i)); G[v].push_back(make_pair(u, i));
edge[i].u = u, edge[i].v = v, edge[i].cost = w;
}
for (int i = 1; i <= n; i++) {
int u = edge[i].u, v = edge[i].v, cost = edge[i].cost;
edge[i].cost = INF;
dijkstra(u, v, cost);
edge[i].cost = cost;
}
if (ans == INF) ans = 0;
printf("Case #%d: %d\n", kase, ans);
}
return 0;
}