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