#include<stdio.h>
#include<stdlib.h>
#define NMAX 50000
#define MMAX 100000
struct muchie{int a,b,c;};
muchie v[MMAX+MMAX+1];
int pv[NMAX+1];
void poz(int li,int ls,int&piv,muchie e[]){
int i=li,j=ls,d=0;
muchie t;
while(i<j){
if(e[i].a>e[j].a){
t=e[i];e[i]=e[j];e[j]=t;d=1-d;
}
i+=d;j-=1-d;
}
piv=i;
}
void qsrt(int st,int dr,muchie e[]){
int piv;
if(st<dr){
poz(st,dr,piv,e);
qsrt(st,piv-1,e);
qsrt(piv+1,dr,e);
}
}
int main(){
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
int n,m,m2,i,j,t,nrt;
int o[NMAX+1]={0};
int ok,este[NMAX+1],sum,min,max;
char sir1[5*NMAX+10],sir[31],*p;
int x,y,z,start,pz;
scanf("%d",&t);
for(nrt=0;nrt<t;++nrt){
scanf("%d%d%d\n",&n,&m,&start);
m2=m+m;
fgets(sir1,5*NMAX,stdin);
p=sir1;
for(i=1;i<=n;++i){
o[i]=atoi(p);
while(*p!=32)++p;++p;
}
for(i=1;i<=m;++i){
fgets(sir,30,stdin);p=sir;
x=atoi(p);
while(*p!=32)++p;++p;
y=atoi(p);
while(*p!=32)++p;++p;
z=atoi(p);
v[i].a=x,v[i].b=y,v[i].c=z;
v[i+m].a=y,v[i+m].b=x,v[i+m].c=z;
}
ok=1;
for(i=1;i<=m&&ok;++i){
x=v[i].a;y=v[i].b;
if(x>n||y>n) {ok=0;break;}
if(o[x]<=o[y]) min=o[x],max=o[y];
else min=o[y],max=o[x];
sum=min+v[i].c;
ok=sum>=max;
}
if(!ok) goto finish;
qsrt(1,m2,v);
for(i=1;i<=n;++i) {pv[i]=0;este[i]=0;}
for(i=1;i<=m2;++i){
pz=v[i].a;
if(!pv[pz]) pv[pz]=i;
}
//ok=1;
este[start]=1;
for(i=1;i<=n&&ok;++i){
if(i==start) ok=o[i]==0;
else{
if(pv[i]){
for(j=pv[i];j<=m2&&v[j].a==i&&ok;++j)
if(o[i]==v[j].c+o[v[j].b])
{este[i]=1;break;}
if(!este[i]) ok=0;
}
else ok=0;
}
}
finish:
ok?printf("DA\n"):printf("NU\n");
}
return 0;
}