### BUGGY CODE ###

import sys
readline = sys.stdin.readline

from heapq import heappop as hpp, heappush as hp
def dijkstra(N, s, Edge):
    geta = 32
    inf = 1<<geta
    dist = [inf] * N
    Q = [s]
    decided = set()
    for _ in range(N):
        while True:
            k = hpp(Q)
            dn = k>>geta
            vn = k^(dn<<geta)
            if vn not in decided:
                decided.add(vn)
                dist[vn] = dn
                break
        for k in Edge[vn]:
            vf = k>>geta
            df = k^(vf<<geta)
            if vf not in decided:
                hp(Q, ((dn + df)<<geta)+vf)
    return dist

MOD = 10**9+7
N, M = map(int, readline().split())

S, T = map(int, readline().split())
S -= 1
T -= 1

geta = 32
Edge = [[] for _ in range(N)]
for _ in range(M):
    u, v, d = map(int, readline().split())
    u -= 1
    v -= 1
    Edge[u].append(v<<geta|d)
    Edge[v].append(u<<geta|d)
    

dists = dijkstra(N, S, Edge)
distt = dijkstra(N, T, Edge)
st = dists[T]

onpath = [i for i in range(N) if dists[i] + distt[i] == st]
oset = set(onpath)
Ls = sorted(onpath, key = lambda x: dists[x])
Lt = sorted(onpath, key = lambda x: distt[x])

dps = [0]*N
dpt = [0]*N
dps[S] = 1
dpt[T] = 1
for v in Ls[:-1]:
    for k in Edge[v]:
        vf = k>>geta
        cost = k^(vf<<geta)
        if dists[v] + cost + distt[vf] == st:
            dps[vf] = (dps[vf] + dps[v])%MOD
for v in Lt[:-1]:
    for k in Edge[v]:
        vf = k>>geta
        cost = k^(vf<<geta)
        if distt[v] + cost + dists[vf] == st:
            dpt[vf] = (dpt[vf] + dpt[v])%MOD

ans = dps[T]**2%MOD
for i in onpath:
    if dists[i] == distt[i]:
        ans = (ans - dps[i]**2*dpt[i]**2)%MOD
    
    for k in Edge[i]:
        vf = k>>geta
        cost = k^(vf<<geta)
        if dists[i] + cost + distt[vf] == st:
            if dists[i] < st//2 and distt[vf] < st//2:
                ans = (ans - dps[i]**2*dpt[vf]**2)%MOD
print(ans)


### FIXED CODE ###

import sys
readline = sys.stdin.readline

from heapq import heappop as hpp, heappush as hp
def dijkstra(N, s, Edge):
    inf = geta
    dist = [inf] * N
    dist[s] = 0
    Q = [(0, s)]
    dp = [0]*N
    dp[s] = 1
    while Q:
        dn, vn = hpp(Q)
        if dn > dist[vn]:
            continue
        for df, vf in Edge[vn]:
            if dist[vn] + df < dist[vf]:
                dist[vf] = dist[vn] + df
                dp[vf] = dp[vn]
                hp(Q, (dn + df,vf))
            elif dist[vn] + df == dist[vf]:
                dp[vf] = (dp[vf] + dp[vn]) % MOD
    return dist, dp

MOD = 10**9+7
N, M = map(int, readline().split())
S, T = map(int, readline().split())
S -= 1
T -= 1

geta = 10**15
Edge = [[] for _ in range(N)]
for _ in range(M):
    u, v, d = map(int, readline().split())
    u -= 1
    v -= 1
    Edge[u].append((d, v))
    Edge[v].append((d, u))
    

dists, dps = dijkstra(N, S, Edge)
distt, dpt = dijkstra(N, T, Edge)
st = dists[T]

onpath = [i for i in range(N) if dists[i] + distt[i] == st]

ans = dps[T]**2%MOD
for i in onpath:
    if 2*dists[i] == 2*distt[i] == st:
        ans = (ans - pow(dps[i]*dpt[i], 2, MOD))%MOD
    
    for cost, vf in Edge[i]:
        if dists[i] + cost + distt[vf] == st:
            if 2*dists[i] < st < 2*dists[vf]:
                ans = (ans - pow(dps[i]*dpt[vf], 2, MOD))%MOD
print(ans)