#include <stdio.h>
#include <cstring>
#define INF 0x7fffffff
using namespace std;
struct edge
{
int y,w,next;
}e[10001];
int ls[10001],cnt[1001][2],dis[1001][2],n,m,maxE=0;
bool vis[1001][2];
void add(int x,int y,int w)
{
e[++maxE]=(edge){y,w,ls[x]};
ls[x]=maxE;
}
void dijkstra(int st,int ed)
{
memset(cnt,0,sizeof(cnt));
memset(vis,false,sizeof(vis));
for (int i=1;i<=n;i++)
dis[i][0]=dis[i][1]=INF;
dis[st][0]=0;
cnt[st][0]=1;
while (1)
{
int min=INF,x,flag;
for (int i=1;i<=n;i++)
if (dis[i][0]<min&&!vis[i][0])
{
min=dis[i][0];
x=i;
flag=0;
}
else
if (dis[i][1]<min&&!vis[i][1])
{
min=dis[i][1];
x=i;
flag=1;
}
if (min==INF)
break;
vis[x][flag]=true;
for (int i=ls[x];i;i=e[i].next)
if (min+e[i].w<dis[e[i].y][0])
{
dis[e[i].y][1]=dis[e[i].y][0];
cnt[e[i].y][1]=cnt[e[i].y][0];
dis[e[i].y][0]=min+e[i].w;
cnt[e[i].y][0]=cnt[x][flag];
}
else
if (min+e[i].w==dis[e[i].y][0])
cnt[e[i].y][0]+=cnt[x][flag];
else
if (min+e[i].w<dis[e[i].y][1])
{
dis[e[i].y][1]=min+e[i].w;
cnt[e[i].y][1]=cnt[x][flag];
}
else
if (min+e[i].w==dis[e[i].y][1])
cnt[e[i].y][1]+=cnt[x][flag];
}
int ans=cnt[ed][0];
if (dis[ed][1]==dis[ed][0]+1)
ans+=cnt[ed][1];
printf("%d\n",ans);
}
int main()
{
int t;
scanf("%d",&t);
while (t--)
{
maxE=0;
memset(ls,0,sizeof(ls));
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++)
{
int x,y,w;
scanf("%d%d%d",&x,&y,&w);
add(x,y,w);
}
int st,ed;
scanf("%d%d",&st,&ed);
dijkstra(st,ed);
}
return 0;
}