#include <stdio.h>
#define MAXN 50000
#define MAXM 100000
int d[MAXN+1], lista[MAXN+1], val[2*MAXM+1], next[2*MAXM+1], q[MAXN+1], ok[MAXN+1], cost[2*MAXM+1], check[MAXN+1], k;
inline void adauga(int a, int b, int c){
k++;
cost[k]=c;
val[k]=b;
next[k]=lista[a];
lista[a]=k;
}
int main(){
int T, t, n, m, s, i, err, st, dr, x, y, p, a, b, c, ck;
FILE *fin, *fout;
fin=fopen("distante.in", "r");
fout=fopen("distante.out", "w");
fscanf(fin, "%d", &T);
for(t=1; t<=T; t++){
fscanf(fin, "%d%d%d", &n, &m, &s);
for(i=1; i<=n; i++){
fscanf(fin, "%d", &d[i]);
check[i]=1;
lista[i]=0;
}
k=0;
for(i=1; i<=m; i++){
fscanf(fin, "%d%d%d", &a, &b, &c);
adauga(a, b, c);
adauga(b, a, c);
}
ck=n-1;
check[s]=0;
q[0]=s;
st=0;
dr=1;
err=(d[s]==0);
ok[s]=t;
while((err==1)&&(st<dr)){
x=q[st++];
p=lista[x];
while(p!=0){
y=val[p];
if(d[x]+cost[p]==d[y]){
ck-=check[y];
check[y]=0;
}
if(d[x]+cost[p]<d[y]){
err=0;
}
if(ok[y]!=t){
ok[y]=t;
q[dr++]=y;
}
p=next[p];
}
}
err&=(ck==0);
if(err==0){
fprintf(fout, "NU\n");
}else{
fprintf(fout, "DA\n");
}
}
fclose(fin);
fclose(fout);
return 0;
}