using namespace std;
#include<cstdio>
#include<string>
#define Nmax 50000
#define Mmax 100000
#define inf 0x3f3f3f3f
#define L (i>>1)
#define R (L|1)
int h[Nmax],d[Nmax],poz[Nmax],d2[Nmax],n,m,s,k,min1,T,sol[11];
struct nod { int v,cost; nod *next;};
nod *a[Nmax];
void add(int i,int j,int c)
{
nod*p=new nod;
p->v=i;
p->next=a[j];
p->cost=c;
a[j]=p;
p=new nod;
p->v=j;
p->next=a[i];
p->cost=c;
a[i]=p;
}
void sc(int i ,int j)
{
int aux=h[i];
h[i]=h[j];
h[j]=aux;
poz[h[i]]=i;
poz[h[j]]=j;
}
void upheap(int i)
{
int tata=i/2;
while(tata && d[h[tata]]>d[h[i]])
{
sc(tata,i);
i=tata;
tata=tata/2;
}
}
void up(int i)
{
if(i <= 1) return;
if(d[h[i]] < d[h[i/2]]) sc(i, i/2), up(i/2);
}
void downheap(int i)
{
int fiu=2*i;
while(fiu<=k)
{
if(fiu<k &&d[h[fiu]]>d[h[fiu+1]]) fiu++;
if(d[h[fiu]]<d[h[i]])
{
sc(fiu,i);
i=fiu;
fiu=fiu*2;
}
else fiu=k+1;
}
}
void down(int i)
{
int m=i;
if(L <= k)
if(d[h[L]] < d[h[m]]) m=L;
if(R <= k)
if(d[h[R]] < d[h[m]]) m=R;
if(i != m) sc(i, m), down(m);
}
void dij(int n,int s)
{
for(int i=0;i<=n;i++)
{
d[i]=inf;
poz[i]=-1;
h[i]=0;
}
k=0;
h[++k]=s;
poz[h[k]]=1;
d[s]=0;
while(k)
{
min1=h[1];
sc(1,k);
k--;
down(1);
for(nod *u=a[min1];u;u=u->next)
if(d[u->v]>d[min1]+u->cost)
{
d[u->v]=d[min1]+u->cost;
if(poz[u->v]!=-1) up(poz[u->v]);
else {
h[++k]=u->v;
poz[u->v]=k;
up(k);
}
}
}
}
int main()
{
int i,x,y,z,t;
freopen("distante.in","r",stdin);
scanf("%d",&T);
for(int t=1;t<=T;t++)
{
memset(a,NULL,sizeof(nod));
scanf("%d%d%d",&n,&m,&s);
for(i=1;i<=n;i++)
scanf("%d",&d2[i]);
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
dij(n,s);
x=0;
for(i=1;i<=n && x==0;i++)
if(d[i]!=d2[i]) x=1;
if(x==0)sol[t]=1;
}
freopen("distante.out","w",stdout);
for(t=1;t<=T;t++)
if(sol[t]) printf("DA\n");
else printf("NU\n");
return 0;
}