//1-contoare,
#include <string.h>
#include <stdio.h>
#define INF 2000000000
#define N 50000
struct nod
{long gnod;
long gcost;
nod *urm;
};
FILE *fin,*fout;
nod *varf,*mp[N+1];
long n,m;
long cost[N+1],flag[N+1],costi[N+1];
void appnod(long,long,long);
void dij(long gnod)
{nod *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!=NULL;pl=pl->urm)
{if(flag[pl->gnod]==0&&cost[pl->gnod]>cost[imin]+pl->gcost)
{cost[pl->gnod]=cost[imin]+pl->gcost;
}
}
}
}
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 sterge()
{nod *pl=varf;
while(pl)
{varf=varf->urm;
delete pl;
pl=varf;
}
}
void citire()
{long i,a,b,c,s;
fscanf(fin,"%ld%ld%ld",&n,&m,&s);
sterge();
for (i=0;i<N+1;i++)
{mp[i]=NULL;}
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 ");
else
fprintf(fout,"NU ");
}
void appnod(long a,long b,long c)
{nod* p=new nod;
p->gnod=a;
p->gcost=c;
p->urm=mp[b];
mp[b]=p;
p=new nod;
p->gnod=b;
p->gcost=c;
p->urm=mp[a];
mp[a]=p;
}
int main ()
{varf=NULL;
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;
}