#include <cstdio>
#include<vector>
#include<algorithm>
using namespace std;
int n,m,nh,T,S,ok;
int d[50003],dist[50003],poz[50003],heap[50003];
vector<pair<int,int> >graf[50003];
void sw(int x, int y)
{
swap(heap[x],heap[y]);
poz[heap[x]]=x;
poz[heap[y]]=y;
}
void heap_up(int k)
{
if(k<=1)
return;
int t=k/2;
if(dist[heap[t]]>dist[heap[k]])
{
sw(t,k);
heap_up(t);
}
}
void heap_down(int k)
{
int f=2*k;
if(f<=nh)
{
if(f+1<=nh&&dist[heap[f+1]]<dist[heap[f]])
f++;
if(dist[heap[f]]<dist[heap[k]])
{
sw(f,k);
heap_down(f);
}
}
}
int inser()
{
sw(1,nh);
poz[heap[nh]]=0;
nh--;
return heap[nh+1];
}
void dij(int nod)
{
for(int i=1;i<=n;i++)
dist[i]=2147483647,poz[i]=heap[i]=i;
dist[nod]=0;
nh=n;
while(nh)
{
nod=inser();
heap_down(1);
for(int i=0;i<graf[nod].size();i++)
if(dist[graf[nod][i].first]>dist[nod]+graf[nod][i].second&&poz[graf[nod][i].first])
{
dist[graf[nod][i].first]=dist[nod]+graf[nod][i].second;
heap_up(poz[graf[nod][i].first]);
}
}
}
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&S);
for(int i=1;i<=n;i++)
scanf("%d",&d[i]);
for(int i=1,x,y,z;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
graf[x].push_back(make_pair(y,z));
graf[y].push_back(make_pair(x,z));
}
dij(S);
ok=0;
for(int i=1;i<=n&&!ok;i++)
if(dist[i]!=d[i])
{
printf("NU\n");
ok=1;
}
if(!ok)
printf("DA\n");
for(int i=0;i<=50003;i++)
{
if(!graf[i].empty())
graf[i].clear();
}
}
return 0;
}