1 //uva10917 dij单源最短路预处理+构造新图(DAG)+求图上路径数
2 #include<iostream>
3 #include<string.h>
4 #include<stdio.h>
5 #include<stdlib.h>
6 #include<cmath>
7 #include<algorithm>
8 #include<queue>
9 #include<stack>
10 #include<set>
11 #include<map>
12 #define maxn 1100
13 #define INF 100000000
14 using namespace std;
15
16 vector<int>G[maxn];
17 int d[maxn];//DAG上dfs记忆化,存储i到终点的路径数
18 struct Edge
19 {
20 int u,v,dis;
21 };
22 struct Node
23 {
24 int d,u;
25 bool operator<(const Node &x)const{
26 return d>x.d;
27 }
28 };
29 struct Dijkstra
30 {
31 int n,m;
32 vector<Edge>edge;
33 vector<int>G[maxn];
34 bool vis[maxn];
35 int d[maxn],p[maxn];
36
37 void init(int n)
38 {
39 this->n=n;
40 edge.clear();
41 for(int i=0;i<=n;i++) G[i].clear();
42 }
43
44 void add(int u,int v,int c){
45 edge.push_back((Edge){u,v,c});
46 m=edge.size();
47 G[u].push_back(m-1);
48 }
49
50 void dij(int s)
51 {
52 memset(vis,0,sizeof(vis));
53 for(int i=0;i<=n;i++) d[i]=INF;
54 d[s]=0;
55 priority_queue<Node>Q;
56 Q.push((Node){0,s});
57 while(!Q.empty()){
58 Node x=Q.top();Q.pop();
59 int u=x.u;
60 if (vis[u]) continue;
61 vis[u]=true;
62 for(int i=0;i<G[u].size();i++)
63 {
64 Edge &e=edge[G[u][i]];
65 if (d[e.v]>d[u]+e.dis){
66 d[e.v]=d[u]+e.dis;
67 p[e.v]=G[u][i];
68 Q.push((Node){d[e.v],e.v});
69 }
70 }
71 }
72 }
73 }Dij1;
74
75 int nextint(){int x;scanf("%d",&x);return x;}
76
77 int n,m,ans;
78
79 int dfs(int st)//DAG上dp,记忆化搜索
80 {
81 int ans=0;
82 if (d[st]!=-1) return d[st];
83 for(int i=0;i<G[st].size();i++) ans+=dfs(G[st][i]);
84 return d[st]=ans;
85 }
86 void read(int n,int m)
87 {
88 for(int i=0;i<m;i++)
89 {
90 int u,v,c;
91 u=nextint();v=nextint();c=nextint();
92 Dij1.add(u,v,c);
93 Dij1.add(v,u,c);
94 }
95 Dij1.dij(2);
96 }
97 void solve(int n,int m)
98 {
99 for(int i=1;i<=n;i++) G[i].clear();
100 //建图,注意是枚举每条边,不可能构造出新的边~
101 for(int i=0;i<Dij1.m;i++)
102 {
103 Edge e=Dij1.edge[i];
104 int u=e.u,v=e.v;
105 if (Dij1.d[u]<Dij1.d[v]) G[v].push_back(u);
106 }
107 for(int i=1;i<=n;i++) d[i]=-1;
108 d[2]=1;
109 dfs(1);
110 printf("%d\n",d[1]);
111 }
112 int main()
113 {
114 int n,m;
115 while(cin>>n)
116 {
117 if (n==0) break;
118 cin>>m;
119 Dij1.init(n);
120 read(n,m);
121 solve(n,m);
122 }
123 return 0;
124 }