Problem:
体育祭Sport Meet

秋の体育祭が行われます。種目は徒競走、ボール運び、障害物競走、リレーの4種目です。参加チームは n チームで、この4種目の合計タイムが最も小さいチームが「優勝」、次に小さいチームが「準優勝」、そして、最下位より2番目のチームを「ブービー賞」として表彰したいと思います。

各チームの成績を入力として、「優勝」、「準優勝」、「ブービー賞」のチームを出力するプログラムを作成してください。
ただし、チームにはそれぞれ 1 から n のチーム番号が割り当てられています。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロひとつの行で示されます。
各データセットは以下の形式で与えられます。

n
record1
record2
:
recordn

１行目に対象となるチームの数 n (4 ≤ n ≤ 100000)、続く n 行に i 番目のチームの情報が与えられます。各チームの情報は以下の形式で与えられます。

id m1 s1 m2 s2 m3 s3 m4 s4

id (1 ≤ id ≤ n)はチーム番号、m1, s1 はそれぞれ徒競走のタイムの分と秒、m2, s2 はそれぞれボール運びのタイムの分と秒、m3, s3 はそれぞれ障害物競走のタイムの分と秒、m4, s4 はそれぞれリレーのタイムの分と秒を表します。分と秒はともに0 以上 59 以下の整数です。また、合計タイムが複数のチームで同じになるような入力はないものとします。

Output

入力データセットごとに以下の形式でチーム番号を出力します。

1 行目 優勝のチーム番号

2 行目 準優勝のチーム番号

3 行目 ブービー賞のチーム番号

Sample Input

8
34001 3 20 3 8 6 27 2 25
20941 3 5 2 41 7 19 2 42
90585 4 8 3 12 6 46 2 34
92201 3 28 2 47 6 37 2 58
10001 3 50 2 42 7 12 2 54
63812 4 11 3 11 6 53 2 22
54092 3 33 2 54 6 18 2 19
25012 3 44 2 58 6 45 2 46
4
1 3 23 1 23 1 34 4 44
2 5 12 2 12 3 41 2 29
3 5 24 1 24 2 0 3 35
4 4 49 2 22 4 41 4 23
0

Output for the Sample Input

54092
34001
10001
1
3
2

Solution in JAVA (judge verdict: Accepted)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class Main {
	private	static	BufferedReader	br = null;

	static {
		br = new BufferedReader(new InputStreamReader(System.in));
	}
 
    /**
     * @param args
     */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int		num = 0;

		while((num = parseNum()) != 0) {
			int[][]	rec = new int[4][4];
			rec[0][1] = Integer.MAX_VALUE;
			rec[1][1] = Integer.MAX_VALUE;
			rec[2][1] = Integer.MIN_VALUE;
			rec[3][1] = Integer.MIN_VALUE;
			for (int i = 0; i < num; i++) {
				int[]	tmp = parseRec();
				if (i == 0) {
					rec[0] = rec[3] = tmp;
				} else {
					if (tmp[1] < rec[0][1]) {
						rec[1] = rec[0];
						rec[0] = tmp;
					} else if (tmp[1] < rec[1][1]) {
						rec[1] = tmp;
					}

					if (tmp[1] > rec[3][1]) {
						rec[2] = rec[3];
						rec[3] = tmp;
					} else if (tmp[1] > rec[2][1]) {
						rec[2] = tmp;
					}
				}
			}

			System.out.println(rec[0][0]);
			System.out.println(rec[1][0]);
			System.out.println(rec[2][0]);
		}
	}

	private static int parseNum() {
		int		param = 0;
		String	strin = null;

		if ((strin = parseStdin()) != null) {
			param = Integer.parseInt(strin);
		}
 
		return param;
	}

	private static int[] parseRec() {
		int[]	param = null;
		String	strin = null;

		if ((strin = parseStdin()) != null) {
			String[]	lines = strin.split(" ");

			param    = new int[2];
			param[0] = Integer.parseInt(lines[0]);
			for (int i = 1; i < lines.length; i+=2) {
				param[1] += Integer.parseInt(lines[i])*60+Integer.parseInt(lines[i+1]);
			}
		}
 
		return param;
	}

	private static String parseStdin() {
        String  stdin = null;
        
        try {
        	String  tmp = br.readLine();
        	if (tmp != null) {
            	if (!tmp.isEmpty()) {
            		stdin = tmp;
            	}
        	}
        }
        catch (IOException e) {}
 
        return stdin;
	}
}