/*
分析:
亢奋死了,1a~
半个月前看到的题,当时只写了一半,当时的思路最后一步需要堆来
辅助。今儿再看到这个题,忽然发现……不用堆也行,虽然会堆了0.0
题目不难,看网上牛牛的思路吧,菜鸟就不献丑了0.0
明儿就期末考试了,菜菜还在这儿敲代码,要挂了T^T~
不过不是说的,一个教室,就我一人儿、听着音乐、敲着代码,不是
第一次了,始终觉得,这感觉,挺好O(∩_∩)O~
2012-06-24
*/
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
struct A
{
int dis;
int flag;
}E[1001];
struct B
{
int dis;
int num;
}T[1001];
int map[1001][1001];
int cmp(const struct B *a,const struct B *b)
{
return b->dis-a->dis;
}
int main()
{
int n,m;
int i,l;
int k;
int a,b,d;
int hash[1001];
int ans[1001];
while(scanf("%d",&n),n)
{
scanf("%d",&m);
for(i=1;i<=n;i++)
for(l=1;l<=n;l++)
map[i][l]=0;
for(i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&d);
map[a][b]=map[b][a]=d;
}
for(i=1;i<=n;i++)
{
E[i].dis=11111111;
E[i].flag=1;
}
k=2;
E[k].dis=0;
while(k)
{
E[k].flag=0;
if(E[k].dis>E[1].dis) break;
for(i=1;i<=n;i++)
{
if(map[i][k]==0) continue;
if(E[k].dis+map[i][k]<E[i].dis) E[i].dis=E[k].dis+map[i][k];
}
k=0;
for(i=1;i<=n;i++) if(E[i].flag) {k=i;break;}
for(i++;i<=n;i++) if(E[i].flag&&E[i].dis<E[k].dis) k=i;
}
if(E[1].dis==11111111) {printf("0\n");continue;}
memset(hash,0,sizeof(hash));
T[0].num=1;
T[0].dis=E[1].dis;
k=1;
hash[1]=1;
for(i=2;i<=n;i++)
{
if(E[i].dis>=E[1].dis) continue;
T[k].num=i;
T[k].dis=E[i].dis;
hash[i]=1;
k++;
}
qsort(T,k,sizeof(T[0]),cmp);
for(i=1;i<=n;i++) ans[i]=0;
ans[1]=1;
for(i=0;i<k;i++)
{
if(ans[T[i].num]==0)continue;
for(l=1;l<=n;l++) if(hash[l]==1&&map[T[i].num][l]!=0&&E[l].dis<T[i].dis) ans[l]+=ans[T[i].num];
}
printf("%d\n",ans[2]);
}
return 0;
}