#include <bits/stdc++.h>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
int distante[50001];
/*
int test(int S, int M)
{
if(distante[S]) // verific daca distanta de la nodul de inceput la el insusi este 0
return -1;
for(int i = 1; i <= M; i++)
if(distante[sursa[i]] + costuri[i] < distante[destinatie[i]]) // verific daca exista un drum de o distanta mai mica fata de distanta data plimbandu-ma prin muchiile grafului
return -1;
return 1;
}
*/
int main()
{
int T, N, M, S, rez, a, b, c;
f >> T;
for(int i = 1; i <= T; i++)
{
rez = 1;
f >> N >> M >> S;
for(int j = 1; j <= N; j++)
f >> distante[j];
if(distante[S]) // verific daca distanta de la nodul de inceput la el insusi este 0
rez = -1;
else
{
for(int j = 1; j <= N; j++)
f >> a >> b >> c; //citesc muchia si costul ei
for(int i = 1; i <= M; i++)
if(distante[a] + c < distante[b]) // verific daca exista un drum de o distanta mai mica fata de distanta data folosindu-ma de muchia citita
rez = -1;
}
if(rez == 1)
g << "DA\n"; // distantele date sunt corecte
else
g << "NU\n"; // s-a gasit un drum de distanta mai mica fata de cea data
}
return 0;
}