/*
    求s到t的最短路与次短路(这里要求只比最短路多1)的条数之和
    
    联想到最小,次小的一种更新关系:
    if(x<最小)更新最小,次小
    else if(==最小)更新方法数
    else if(x<次小)更新次小
    else if(x==次小)更新方法数

    同时记录s到u最短,次短路及方法数
    用一个堆每次取最小的,更新完后再入堆
    还是那个原理,第一次遇到的就是最优的,然后vi标记为真
    方法数注意是加法原理,不是乘法
    \
    -- u -- v  所以是加法原理
    /
*/

#include
<cstdio>
#include
<cstring>
#include
<algorithm>
#include
<queue>
using namespace std;

const int MAXN=1010;
const int INF=1000000000;

bool vi[MAXN][2];
int dist[MAXN][2],cnt[MAXN][2];//0 表示最短路 1表示次短路
int G[MAXN];
int n,m,alloc;

struct Node{
    
int v,w,next;
}
nodes[MAXN*10];

struct Pos{
    
int v,flag;
    Pos(
int vv,int f){v=vv,flag=f;}
    
bool operator<(const Pos &p)const {
        
return dist[v][flag]>dist[p.v][p.flag];
    }

}
;

void add(int a,int b,int c){
    alloc
++;
    nodes[alloc].v
=b,nodes[alloc].w=c,nodes[alloc].next=G[a];
    G[a]
=alloc;
}


int dij(int s,int t){
    memset(vi,
0,sizeof(vi));
    memset(cnt,
0,sizeof(cnt));
    
for(int i=1;i<=n;i++)
        dist[i][
0]=dist[i][1]=INF;
    priority_queue
<Pos>Q;
    Q.push(Pos(s,
0));
    dist[s][
0]=0;cnt[s][0]=1;
    
while(!Q.empty()){
        Pos top
=Q.top();Q.pop();
        
int u=top.v,flag=top.flag;
        
if(vi[u][flag])continue;
        vi[u][flag]
=1;
        
for(int son=G[u];son;son=nodes[son].next){
            
int v=nodes[son].v,w=dist[u][flag]+nodes[son].w;
            
if(w<dist[v][0]){
                
if(dist[v][0]!=INF){
                    dist[v][
1]=dist[v][0];
                    cnt[v][
1]=cnt[v][0];
                    Q.push(Pos(v,
1));
                }

                dist[v][
0]=w;
                cnt[v][
0]=cnt[u][flag];
                Q.push(Pos(v,
0));
            }

            
else if(w==dist[v][0])cnt[v][0]+=cnt[u][flag];
            
else if(w<dist[v][1]){
                dist[v][
1]=w;
                cnt[v][
1]=cnt[u][flag];
                Q.push(Pos(v,
1));
            }

            
else if(w==dist[v][1])cnt[v][1]+=cnt[u][flag];
        }

    }


    
int ans=cnt[t][0];
    
if(dist[t][0]==dist[t][1]-1)ans+=cnt[t][1];
    
return ans;
}

int main(){
    
int T,a,b,c;
    scanf(
"%d",&T);
    
while(T--){
        scanf(
"%d%d",&n,&m);
        memset(G,
0,sizeof(G));
        alloc
=0;
        
while(m--){
            scanf(
"%d%d%d",&a,&b,&c);
            add(a,b,c);
        }

        scanf(
"%d%d",&a,&b);
        printf(
"%d\n",dij(a,b));
    }

    
return 0;
}