#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define mem(a, b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define DBG printf("this is a input\n")
#define fi first
#define se second
#define mk(a, b) make_pair(a,b)
#define p_queue priority_queue
ll gcd(ll a, ll b) {
return b == 0 ? a : gcd(b, a % b);
}
ll lcm(ll a, ll b) {
return a / gcd(a, b) * b;
}
const ll mod = 2147483647;
int n , m;
int head[1005] , cnt;
struct e{
int t, next;
ll w;
}edge[2000000];
ll dis[1005], vis[1005];
ll dp[1005];
void add(int f , int t, ll w)
{
edge[cnt].t = t;
edge[cnt].w = w;
edge[cnt].next = head[f];
head[f] = cnt ++;
}
void dijkstra()
{
mem(dis,INF);
dis[1] = 0;
for(int i = 1 ; i <= n ; i ++)
{
int minn = INF, index;
for(int j = 1 ; j <= n ; j ++)
{
if(minn > dis[j] && !vis[j])
{
index = j;
minn = dis[j];
}
}
vis[index] = 1;
for(int j = head[index] ; j != -1 ; j = edge[j].next)
{
int v = edge[j].t , w = edge[j].w;
dis[v] = min(dis[v],dis[index] + w);
}
}
}
int main(void)
{
mem(head,-1);
cin>>n>>m;
for(int i = 1 ; i <= m ; i ++)
{
int u , v, w;
cin>>u>>v>>w;
add(u,v,w);
add(v,u,w);
}
dijkstra();
ll ans = 1;
for(int i = 1 ; i <= n ; i ++)
{
for(int j = head[i] ; j != -1 ; j = edge[j].next)
{
int v = edge[j].t , w = edge[j].w;
if(dis[v] == dis[i] + w)
dp[v] ++, dp[v] %= mod;
}
}
for(int i = 1 ; i <= n ; i ++)
if(dp[i] != 0)
ans = (ans * dp[i])%mod;
cout<<ans%mod<<endl;
}