#include<stdio.h>
#include<iomanip.h>
#define dim 100001
typedef struct nod{
int info,cost;
nod*urm;
}*pnod,NOD;
pnod l[dim];
int n,m,start;
int teste;
int d[dim],s[dim],t[dim];
int sir[dim];
void citire();
void add(int ,int ,int );
void dijkstra(int );
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
citire();
return 0;
}
void citire()
{
int i,j,x,y,cost;
scanf("%d",&teste);
for(int poz=1;poz<=teste;poz++)
{
memset(l,0,sizeof(l));
scanf("%d %d %d",&n,&m,&start);
for(i=1;i<=n;i++)
scanf("%d ",&sir[i]);
for(j=1;j<=m;j++)
{
scanf("%d %d %d",&x,&y,&cost);
add(x,y,cost);
add(y,x,cost);
}
dijkstra(start);
}
}
void add(int i,int j,int cost)
{
pnod p=new NOD;
p->info=j;
p->cost=cost;
p->urm=l[i];
l[i]=p;
}
void dijkstra(int nod)
{
int i,j,pas,min,max,k,nr=0;
max=-32000;
memset(s,0,sizeof(s));
memset(t,0,sizeof(t));
memset(d,0,sizeof(d));
for(i=1;i<=n;i++)
{
d[i]=32000;
t[i]=0;
}
for(pnod p=l[nod];p;p=p->urm)
{
d[p->info]=p->cost;
t[p->info]=nod;
}
d[nod]=0;
s[nod]=1;
for(pas=1;pas<n;pas++)
{
min=32000;
for(i=1;i<=n;i++)
if(!s[i] && d[i]<min)
{
min=d[i];
k=i;
}
s[k]=1;
for(pnod p=l[k];p;p=p->urm)
if((!s[p->info]) &&( d[p->info]>d[k]+p->cost))
{
d[p->info]=d[k]+p->cost;
t[p->info]=k;
s[p->info]=1;
}
}
for(i=1;i<=n;i++)
if(d[i]==sir[i])
nr++;
if(nr==n) printf("DA\n");
else
printf("NU\n");
}