#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int N_max=100001;
const int T_max=11;
char s[200];
int v[N_max][T_max],dist[N_max][T_max];
bool adevarat=1;
struct poz
{
int nod,lungime;
};
struct poz1
{
int nod1,cost1;
poz1 *urm;
}*muchii[N_max][T_max];
struct cmp
{
bool operator () (const poz &a,const poz &b)
{
return a.lungime>b.lungime;
}
};
priority_queue < poz , vector <poz> , cmp > pq;
void adauga(int a,int b,int c,int test)
{
poz1 *p;
p=new poz1;
p->nod1=b;
p->cost1=c;
if (muchii[a][test]==NULL)
p->urm=NULL, muchii[a][test]=p;
else p->urm=muchii[a][test], muchii[a][test]=p;
}
void sterge(int a,int b,int test)
{
poz1 *p,*p1;
p=muchii[a][test];
p1=muchii[a][test]->urm;
if (p->nod1==b)
{
muchii[a][test]=p1;
delete p;
}
else while (p1)
{
if (p1->nod1==b)
{
p->urm=p1->urm;
delete p1;
break;
}
else p=p->urm, p1=p1->urm;
}
}
void adauga_in_heap(int a,int b,int test)
{
poz1 *p,*p1;
p=muchii[a][test];
if (p!=0)
{
p1=muchii[a][test]->urm;
while (p1)
{
if (dist[p->nod1][test]==-1)
{
dist[p->nod1][test]=p->cost1+b;
pq.push({p->nod1,p->cost1+b});
}
sterge(p->nod1,a,test);
delete p;
p=p1;
p1=p1->urm;
}
if (dist[p->nod1][test]==-1)
{
dist[p->nod1][test]=p->cost1+b;
pq.push({p->nod1,p->cost1+b});
sterge(p->nod1,a,test);
delete p;
}
}
}
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
int T;
scanf("%d\n",&T);
for (int test=1;test<=T;test++)
{
int n=0,m=0,S=0;
adevarat=1;
scanf("%d %d %d\n",&n,&m,&S);
for (int i=1;i<=n;i++)
{
scanf("%d ",&v[i][test]);
if (i!=S)
dist[i][test]=-1;
else dist[i][test]=0;
}
for (int i=1;i<=m;i++)
{
int a=0,b=0,c=0;
scanf("%d %d %d\n",&a,&b,&c);
adauga(a,b,c,test);
adauga(b,a,c,test);
}
if (v[S][test]==0)
{
adauga_in_heap(S,0,test);
while (!pq.empty())
{
poz op1=pq.top();
pq.pop();
if (op1.lungime != v[op1.nod][test])
{
adevarat=0;
while (!pq.empty()) pq.pop();
}
else
adauga_in_heap(op1.nod,op1.lungime,test);
}
}
else adevarat=0;
if (adevarat==1) printf("DA\n");
else printf("NU\n");
}
}