#include <stdio.h>
#include <fstream>
#include <vector>
#include <iostream>
#include <queue>
#include <limits.h>
using namespace std;
#define INF INT_MAX
typedef pair<int,int> PII;
int main(void) {
int T = 0;
ifstream fin("distante.in");
ofstream fout("distante.out");
fin>>T;
for (int i = 0; i < T; i++) {
int N,M,s;
fin>>N>>M>>s;
vector< vector<PII> > edges(N);
int dmin[N];
for (int j = 0; j < N; ++j)
fin>>dmin[j];
for (int j = 0; j < M; j++) {
int node1, node2, cost;
fin>>node1>>node2>>cost;
node1--,node2--;
edges[node1].push_back(make_pair(cost,node2));
edges[node2].push_back(make_pair(cost,node1));
}
s--;
vector<int> dist(N,INF);
vector<int> viz(N,0);
dist[s] = 0;
priority_queue<PII, vector<PII>, greater<PII> > Q;
Q.push(make_pair(0,s));
int k = 0;
while(!Q.empty() && k<=N) {
PII p = Q.top();
Q.pop();
int node = p.second;
if(viz[node] != 0) continue;
viz[node] = 1;
for (vector<PII>::iterator it = edges[node].begin(); it != edges[node].end(); it++) {
if(dist[it->second] > dist[node] + it->first)
{
dist[it->second] = dist[node] + it->first;
Q.push(make_pair(dist[it->second], it->second));
}
}
k++;
}
int ok = 0;
for(int j = 0;j<N;j++){
if(dist[j] != dmin[j]){
ok = 1;break;
}
}
if(ok == 1)
cout<<"NU\n";
else
cout<<"DA\n";
}
return 0;
}