//1-contoare,
#include <string.h>
#include <stdio.h>
#define INF 200000000
#define M 100000
#define N 50000
long muc[2*M+2][3];
long mp[N+1],varf;
FILE *fin,*fout;
long n,m;
long cost[N+1],flag[N+1],costi[N+1];
void appnod(long,long,long);
void dij(long gnod)
{long pl;
long i,j,min,imin;
cost[gnod]=0;
for (i=0;i<n-1;i++)
{for (imin=0,min=INF,j=1;j<=n;j++)
{if(flag[j]==0&&min>cost[j])
{min=cost[j];imin=j;
}
}
flag[imin]=1;
for(pl=mp[imin];pl!=0;pl=muc[pl][2])
{if(flag[muc[pl][0]]==0&&cost[muc[pl][0]]>cost[imin]+muc[pl][1])
{cost[muc[pl][0]]=cost[imin]+muc[pl][1];
}
}
}
}
long compar()
{long i,flag=1;
for (i=1;i<=n;i++)
{if(costi[i]!=cost[i])
{flag=0;break;}
}
if(flag)
{return 1;}
else
return 0;
}
void citire()
{long i,a,b,c,s;
fscanf(fin,"%ld%ld%ld",&n,&m,&s);
memset(mp,0,sizeof(mp));
memset(muc,0,sizeof(muc));
varf=1;
for (i=1;i<=n;i++)
{fscanf(fin,"%ld",&costi[i]);
}
for (i=0;i<m;i++)
{fscanf(fin,"%ld%ld%ld",&a,&b,&c);
appnod(a,b,c);
}
for (i=1;i<=n;i++)
{cost[i]=INF;}
memset(flag,0,sizeof(flag));
dij(s);
if(compar())
fprintf(fout,"DA\n");
else
fprintf(fout,"NU\n");
}
void appnod(long a,long b,long c)
{muc[varf][0]=b;
muc[varf][1]=c;
muc[varf][2]=mp[a];
mp[a]=varf;
varf++;
muc[varf][0]=a;
muc[varf][1]=c;
muc[varf][2]=mp[b];
mp[b]=varf;
varf++;
}
int main ()
{varf=1;
long i,t;
fin=fopen("distante.in","r");
fout=fopen("distante.out","w");
fscanf(fin,"%ld",&t);
for (i=0;i<t;i++)
{citire();
}
fclose(fout);
return 0;
}