#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 5e3 + 10, inf = 0x7f7f7f7f, mod = 100003;
int n, m;
struct node {
int v, w;
};
vector<node> e[maxn << 1];
struct edge{
int to, dis;
bool operator < (const edge &o) const{return dis > o.dis;}
};
int dis[maxn];
bool vis[maxn];
void dijkstra(int s) {
memset(vis, 0, sizeof vis);
memset(dis, 0x7f, sizeof dis);
priority_queue<edge> q;
q.push({s, 0});
dis[s] = 0;
while (!q.empty()) {
int u = q.top().to;
q.pop();
if (vis[u]) continue;
vis[u] = 1;
for (auto ed: e[u]) {
int v = ed.v, w = ed.w;
if (dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;
q.push({v, dis[v]});
}
}
}
}
int ans;
void dfs(int u, int fa) {
if (u == 2) {
ans++;
return;
}
for (auto ed: e[u]) if (ed.v != fa) {
if (dis[ed.v] < dis[u]) dfs(ed.v, u);
}
}
void init() {
for (int i = 0; i < maxn; ++i) e[i].clear();
ans = 0;
}
void solve() {
init();
for (int i = 1, u, v, w; i <= m; ++i) {
cin >> u >> v >> w;
e[u].push_back({v, w});
e[v].push_back({u, w});
}
dijkstra(2);
if (dis[2] == inf) {
cout << 0 << '\n';
return;
}
dfs(1, 0);
cout << ans << '\n';
}
signed main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
while (cin >> n) {
if (n == 0) exit(0);
cin >> m;
solve();
}
}