#include <iostream>
#include <fstream>
#include <set>
#include <vector>
#define INF 99999999
#define MAX 1000000
using namespace std;
vector<pair<long int,long int> > graf[MAX];
long int t, n, m, start, from, to, weight;
long int dist[MAX];
long int test[MAX];
bool check = true;
void dijkstra(){
set<pair<long int,long int> > min;
dist[start] = 0;
min.insert(make_pair(0, start));
while(!min.empty()){
int node = min.begin()->second;
min.erase(min.begin());
for(vector<pair<long int,long int> > ::iterator it = graf[node].begin() ; it != graf[node].end(); it++){
to = it -> first;
weight = it -> second;
if(dist[to]>dist[node]+weight){
if(dist[to]!=INF)
min.erase(min.find(make_pair(dist[to],to)));
dist[to] = dist[node]+weight;
min.insert(make_pair(dist[to], to));
}
}
}
}
int main()
{
ifstream be("distante.in");
ofstream ki("distante.out");
be >> t;
for(int i = 1; i <= t; i++){
be>>n>>m>>start;
for(int k=1; k<=n; k++){
be>>test[k];
graf[k].erase(graf[k].begin(), graf[k].end());
}
for(int j=1; j<=m; j++){
be>>from>>to>>weight;
graf[from].push_back(make_pair(to,weight));
graf[to].push_back(make_pair(from,weight));
dist[j]=INF;
}
dijkstra();
for(int j=1; j<=n; j++){
if (dist[j]==INF)
dist[j] = 0;
if(dist[j]!=test[j]){
check = false;
break;
}
}
if (check)
ki<<"DA"<<endl;
else ki<<"NU"<<endl;
check = true;
}
be.close();
ki.close();
}