#include <cstdio> #include <cstring> #include <vector> #include <queue> #include <algorithm> using namespace std; #define INF 99999999 #define MAXN 205 vector<int> edge[MAXN]; int cap[MAXN][MAXN], flow[MAXN][MAXN], cost[MAXN][MAXN]; int pre[MAXN], dis[MAXN]; bool used[MAXN][MAXN]; // used[i][j] == true means edge(i,j) is used void Initial(int N); void MCMF(int S, int T); bool SPFA(int S, int T); void UpdateFlow(int S, int T, int bottleneck); int main() { int N, M; while (scanf("%d", &N) && N) { scanf("%d", &M); Initial(N); int u, v, t; for (int i = 0; i < M; ++i) { scanf("%d %d %d", &u, &v, &t); cap[u][v] = cap[v][u] = 1; cost[u][v] = cost[v][u] = t; edge[u].push_back(v); edge[v].push_back(u); } MCMF(N, 1); } } void Initial(int N) { for (int i = 1; i <= N; ++i) edge[i].clear(); memset(cap, 0, sizeof(cap)); memset(flow, 0, sizeof(flow)); memset(cost, 0, sizeof(cost)); memset(used, 0, sizeof(used)); } void MCMF(int S, int T) { int min_cost = 0; int max_flow = 0; while (SPFA(S, T)) { UpdateFlow(S, T, 1); min_cost += dis[T]; ++max_flow; if (max_flow >= 2) break; } if (max_flow < 2) puts("Back to jail"); else printf("%d\n", min_cost); } bool SPFA(int S, int T) { fill(begin(dis), end(dis), INF); queue<int> Q; bool inQueue[MAXN] = {0}; dis[S] = 0; Q.push(S); inQueue[S] = true; while (!Q.empty()) { int cur = Q.front(); Q.pop(); inQueue[cur] = false; for (int nxt : edge[cur]) { if (flow[nxt][cur] > 0 && dis[cur] + (-cost[nxt][cur]) < dis[nxt]) { dis[nxt] = dis[cur] + (-cost[nxt][cur]); pre[nxt] = cur; if (!inQueue[nxt]) {inQueue[nxt] = true; Q.push(nxt);} } else if (!used[cur][nxt] && cap[cur][nxt] > flow[cur][nxt] && dis[cur] + cost[cur][nxt] < dis[nxt]) { dis[nxt] = dis[cur] + cost[cur][nxt]; pre[nxt] = cur; if (!inQueue[nxt]) {inQueue[nxt] = true; Q.push(nxt);} } } } return dis[T] != INF; } void UpdateFlow(int S, int T, int bottleneck) { for (int u = T; u != S; u = pre[u]) { flow[pre[u]][u] += bottleneck; flow[u][pre[u]] -= bottleneck; used[pre[u]][u] = used[u][pre[u]] = true; } }