//题目大意:一副骨诺牌,有N个关键点.关键点被碰到以后,与该关键点连的边开始倒..
// 问最后一个倒的骨诺牌在哪儿和时间
//题目连接:http://poj.org/problem?id=1135
//解题思路:首先分析每个点所到达的最短时间,因为每条边都是在点倒了以后才开始倒..
// 问最后一个倒的骨诺牌在哪儿和时间
//题目连接:http://poj.org/problem?id=1135
//解题思路:首先分析每个点所到达的最短时间,因为每条边都是在点倒了以后才开始倒..
// 那么最后的那个点如果是在边中间的话,必定也是由这个关键点的最短时间开始将边倒塌..
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<string.h>
#include<vector>
#include<math.h>
#include<queue>
const int mn = 555;
const double ll = 0.0001;
using namespace std;
struct node
{
int star,end,val;
}test[mn];
bool vis[mn];
int d[mn],map[mn][mn];
int main()
{
int m,n;
int cas = 0;
while(scanf("%d%d",&n,&m) && n + m != 0)
{
for(int i = 1 ; i <= n ; i++)
for(int j = 1 ; j <= n ; j++)
map[i][j] = 0x3f3f3f;
for(int i = 1 ; i <= m ; i++)
{
scanf("%d%d%d",&test[i].star,&test[i].end,&test[i].val);
map[test[i].star][test[i].end] = test[i].val;
map[test[i].end][test[i].star] = test[i].val;
}
memset(vis,0,sizeof(vis));
for(int i = 1 ; i <= n ; i++)d[i] = 0x3f3f3f;
d[1] = 0;vis[1] = 1;
int t = 1;
for(int i = 1 ; i <= n ; i++)
{
for(int j = 1 ; j <= n ; j++)
{
if(!vis[j] && d[j] > d[t] + map[t][j])
d[j] = d[t] + map[t][j];
}
int mx = 0x3f3f3f;
for(int j = 1 ; j <= n ; j++)
{
if(!vis[j] && d[j] < mx)
{
mx = d[j];
t = j;
}
}
vis[t] = 1;
}
int ans = 0;
int pm = 1;
for(int i = 1 ; i <= n ; i++)
if(ans < d[i])
{
ans = d[i];
pm = i;
}
// for(int i = 1 ; i <= n ; i++)printf("%d ",d[i]);
double res = ans;
int cas1,cas2;
bool flag = 0;
for(int i = 1 ; i <= m ; i++)
{
int x = max(d[test[i].star],d[test[i].end]);
int y = min(d[test[i].star],d[test[i].end]);
double p = x + 1.0*(test[i].val - x + y)/2;
if(res - p < -ll)
{
res = p;
flag = 1;
cas2 = max(test[i].star,test[i].end);
cas1 = min(test[i].end,test[i].star);
}
}
cas++;
printf("System #%d\n",cas);
if(flag)printf("The last domino falls after %.1lf seconds, between key dominoes %d and %d.\n\n",res,cas1,cas2);
else printf("The last domino falls after %.1lf seconds, at key domino %d.\n\n",res,pm);
}
}