/*
* Problem :: 4883 / 삼각 그래프
*
* Kind :: Dynamic Programming
*
* Insight
* - dp[i][j] = i 번째 행, j 번째 정점으로 가는 경로중 최소 비용이라고 하자
* + dp[i+1][j] 를 구할 때 도움이 되는가?
* # YES
* -> DP 로 풀어야 겠다
* (그래프의 화살표가 나를 보고 'DP 를 이래도 안 쓸거야?' 라며 묻는 것 같다)
*
* Point
* - dp[i][0] 은 dp[i-1][0], dp[i-1][1] 로 부터 화살표를 받고 있고
* dp[i][1] 은 dp[i][0], dp[i-1][0], dp[i-1][1], dp[i-1][2] 로 부터 화살표를 받고 있고
* dp[i][2] 는 dp[i][1], dp[i-1][1], dp[i-1][2] 로 부터 화살표를 받고 있다
* + 이를 이용해서 DP 를 돌려주자
*
* - 초기화를 조심하자
* + 정점 (0, 0) 을 지나는 경로는 존재하지 않는다
* # dp[0][0] = INF
* + 정점 (0, 1) 은 시작위치다
* # dp[0][1] = graph[0][1]
* + 정점 (0, 2) 를 지나는 경로는 하나밖에 없다
* # dp[0][2] = graph[0][2] + dp[0][1]
*
* - max(N) = 10^5, max(정점비용) = 10^3
* max(경로비용) = 10^8
* + int 써도 괜찮다
*/
//
// BOJ
// ver.C++
//
// Created by GGlifer
//
// Open Source
#include <iostream>
#include <climits>
#include <cstring>
#include <algorithm>
using namespace std;
#define endl '\n'
// Set up : Global Variables
#define INF INT_MAX
// Set up : Functions Declaration
/* None */
int main()
{
// Set up : I/O
ios::sync_with_stdio(false);
cin.tie(nullptr);
// Set up : Input
int N, tc = 0;
while (true) {
cin >> N;
if (N == 0) break;
tc++;
int G[N][3];
for (int i=0; i<N; i++) {
for (int j=0; j<3; j++) {
cin >> G[i][j];
}
}
// Process
int dp[N][3];
memset(dp, 0, sizeof(dp));
/* 알맞게 초기화 */
dp[0][0] = INF; /* 정점 (0, 0) 을 지나느 경로는 없음 */
dp[0][1] = G[0][1]; /* 정점 (0, 1) 은 시작위치 */
dp[0][2] = G[0][2] + dp[0][1]; /* 정점 (0, 2) 를 지나느 경로는 하나밖에 없음 */
for (int i=1; i<N; i++) {
/* 가능한 경로(들어오는 화살표)를 다 비교하여 최소비용을 구함 */
dp[i][0] = G[i][0] + min({dp[i-1][0], dp[i-1][1]});
dp[i][1] = G[i][1] + min({dp[i][0], dp[i-1][0], dp[i-1][1], dp[i-1][2]});
dp[i][2] = G[i][2] + min({dp[i][1], dp[i-1][1], dp[i-1][2]});
}
// Control : Output
printf("%d. %d\n", tc, dp[N-1][1]);
}
}
// Helper Functions
/* None */