/// BMDesktop
#include <iostream>
#include <fstream>
#include <algorithm>
#include <bitset>
#include <vector>
#include <deque>
#include <set>
#define dim 50005
#define inf 2000000000
using namespace std;
string nameProb="distante";
ifstream fin(nameProb+".in");
ofstream fout(nameProb+".out");
vector < pair<int,int> > L[dim];
int d[dim],n,m,srs,x,y,c,off[dim];
void dijkstra(int nod)
{
d[nod]=0;
set< pair<int,int> > s;
s.insert({d[nod],nod});
while(s.size())
{
auto aux=s.begin();
s.erase(s.begin());
nod=aux->second;
for(auto it:L[nod])
{
if( d[it.first] > d[nod]+it.second)
{
s.erase({d[it.first],it.first});
d[it.first]=d[nod]+it.second;
s.insert({d[it.first],it.first});
}
}
}
}
void golire(int n)
{
for(int i=1; i<=n; i++)
d[i]=inf;
for(int i=1; i<=n; i++)
L[i].clear();
}
int main()
{
int t;
fin>>t;
for(int test=1; test<=t; test++)
{
fin>>n>>m>>srs;
golire(n);
for(int i=1; i<=n; i++)
fin>>off[i]; /// dist oficiala
for(int i=1; i<=m; i++)
{
fin>>x>>y>>c;
L[y].push_back({x,c});
L[x].push_back({y,c});
}
dijkstra(srs);
int ok=0;
for(int i=1; i<=n; i++)
{
if(off[i]!=d[i])
{
ok=1;
break;
}
}
if(ok==0)
fout<<"DA\n";
else
fout<<"NU\n";
}
}