#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<functional>
#include<utility>
#include<queue>
#include<limits>
#include<cstdio>
using namespace std;
const long long int INF = 100000005;
typedef pair <long long int ,long long int> p;
vector<p> adj[100005];
void dijkstra(long long int x,long long int b);
int main()
{
ios_base::sync_with_stdio(false);
long long nodes,t,edges,x,y,weight,a,b;
cin>>t;
while(t--)
{
cin>>nodes>>edges;
for(long long int i=1;i<=edges;i++)
{
cin>>x>>y>>weight;
adj[x].push_back(make_pair(weight,y));
//adj[y].push_back(make_pair(weight,x));
}
cin>>a>>b;
dijkstra(a,b);
for(long long i = 1; i <= nodes; i++) adj[i].clear();
}
return 0;
}
void dijkstra(long long int a,long long int b)
{
priority_queue< p,vector<p>,greater <p> > q;
long long int cost[100005];
memset(cost,INF,sizeof(cost));
q.push(make_pair(0,a));
cost[a]=0;
while(!q.empty())
{
p pi=q.top(); //why error
q.pop();
long long int u=pi.second; //vertex
long long int v=pi.first; //weight
if(cost[u]<v)
continue;
//check
for(long long int i=0;i<adj[u].size();i++)
{
long long int w=adj[u][i].first; //edge weight
long long int x=adj[u][i].second; //node
if(cost[x]>cost[u]+w)
{
cost[x]=cost[u]+w;
q.push(make_pair(cost[x],x));
}
}
}
if(cost[b]>=INF)
{
cout<<"NO\n";
return ;
}
cout<<cost[b]<<"\n";
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPGNzdHJpbmc+CiNpbmNsdWRlPHZlY3Rvcj4KI2luY2x1ZGU8YWxnb3JpdGhtPgojaW5jbHVkZTxmdW5jdGlvbmFsPgojaW5jbHVkZTx1dGlsaXR5PgojaW5jbHVkZTxxdWV1ZT4KI2luY2x1ZGU8bGltaXRzPgojaW5jbHVkZTxjc3RkaW8+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNvbnN0IGxvbmcgbG9uZyBpbnQgSU5GID0gMTAwMDAwMDA1Owp0eXBlZGVmIHBhaXIgPGxvbmcgbG9uZyBpbnQgLGxvbmcgbG9uZyBpbnQ+IHA7CnZlY3RvcjxwPiBhZGpbMTAwMDA1XTsKdm9pZCBkaWprc3RyYShsb25nIGxvbmcgaW50IHgsbG9uZyBsb25nIGludCBiKTsKaW50IG1haW4oKQogIHsKICAJaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgCWxvbmcgbG9uZyBub2Rlcyx0LGVkZ2VzLHgseSx3ZWlnaHQsYSxiOwogIAljaW4+PnQ7CiAgCXdoaWxlKHQtLSkKICAJewogIAkgY2luPj5ub2Rlcz4+ZWRnZXM7CiAgCSBmb3IobG9uZyBsb25nIGludCBpPTE7aTw9ZWRnZXM7aSsrKQogIAkgIHsKICAJICAgIGNpbj4+eD4+eT4+d2VpZ2h0OwkKICAJICAgIGFkalt4XS5wdXNoX2JhY2sobWFrZV9wYWlyKHdlaWdodCx5KSk7CiAgCSAgICAvL2Fkalt5XS5wdXNoX2JhY2sobWFrZV9wYWlyKHdlaWdodCx4KSk7CgkgIH0KCSAgY2luPj5hPj5iOwoJICBkaWprc3RyYShhLGIpOwoJICBmb3IobG9uZyBsb25nIGkgPSAxOyBpIDw9IG5vZGVzOyBpKyspIGFkaltpXS5jbGVhcigpOwogICAgIH0KCXJldHVybiAwOwogIH0KCgl2b2lkIGRpamtzdHJhKGxvbmcgbG9uZyBpbnQgYSxsb25nIGxvbmcgaW50IGIpCiAgIAl7CgkgICAJcHJpb3JpdHlfcXVldWU8IHAsdmVjdG9yPHA+LGdyZWF0ZXIgPHA+ID4gcTsKCSAgIAlsb25nIGxvbmcgaW50IGNvc3RbMTAwMDA1XTsKCSAgIAltZW1zZXQoY29zdCxJTkYsc2l6ZW9mKGNvc3QpKTsKCSAgIAlxLnB1c2gobWFrZV9wYWlyKDAsYSkpOwogICAJIAljb3N0W2FdPTA7CiAgIAkJd2hpbGUoIXEuZW1wdHkoKSkKICAgCSAgIAl7CiAgIAkgICAgICAJcCBwaT1xLnRvcCgpOyAgLy93aHkgZXJyb3IKICAgCSAgICAgIAlxLnBvcCgpOwoJCSAJbG9uZyBsb25nIGludCB1PXBpLnNlY29uZDsgICAvL3ZlcnRleAoJCSAgCWxvbmcgbG9uZyBpbnQgdj1waS5maXJzdDsgICAgLy93ZWlnaHQKCQkgIAlpZihjb3N0W3VdPHYpCgkJICAJY29udGludWU7CgkJICAJLy9jaGVjawoJCSAgCWZvcihsb25nIGxvbmcgaW50IGk9MDtpPGFkalt1XS5zaXplKCk7aSsrKQoJCSAgCXsKCQkJICAgCWxvbmcgbG9uZyBpbnQgdz1hZGpbdV1baV0uZmlyc3Q7ICAgLy9lZGdlIHdlaWdodAoJCSAgIAkJbG9uZyBsb25nIGludCB4PWFkalt1XVtpXS5zZWNvbmQ7ICAvL25vZGUKCQkgIAkJaWYoY29zdFt4XT5jb3N0W3VdK3cpCgkJICAJICAJewoJCQkgIAkgICAJY29zdFt4XT1jb3N0W3VdK3c7CgkJCQkJcS5wdXNoKG1ha2VfcGFpcihjb3N0W3hdLHgpKTsJCgkJCSAgCX0KCQkgIAl9CgkgICAJfQoJICAgCWlmKGNvc3RbYl0+PUlORikKCSAgIAl7CgkgICAJY291dDw8Ik5PXG4iOwoJCSAgIAlyZXR1cm4gOwoJICAgCX0KICAgCQljb3V0PDxjb3N0W2JdPDwiXG4iOwogICAJfQ==