#include // iostream is too mainstream #include // bitch please #include #include #include #include #include #include #include #include #include #include #include #include #define dibs reserve #define OVER9000 1234567890 #define ALL_THE(CAKE,LIE) for(auto LIE =CAKE.begin(); LIE != CAKE.end(); LIE++) #define tisic 47 #define soclose 1e-8 #define chocolate win // so much chocolate #define patkan 9 #define ff first #define ss second #define abs(x) ((x < 0)?-(x):x) #define uint unsigned int #define dbl long double #define pi 3.14159265358979323846 using namespace std; // mylittledoge #ifdef DONLINE_JUDGE // palindromic tree is better than splay tree! #define lld I64d #endif int main() { cin.sync_with_stdio(0); cin.tie(0); cout << fixed << setprecision(10); int T, mx =50000; scanf(" %d",&T); for(int t =0; t < T; t++) { int N,M; scanf(" %d %d",&N,&M); vector tp(mx+tisic,0); for(int i =0; i < N; i++) { int a; scanf(" %d",&a); tp[a]++;} vector< vector< pair > > upd(mx+tisic); for(int i =0; i < M; i++) { int d; pair p; scanf(" %d %d %d",&d,&p.ff,&p.ss); upd[d].push_back(p);} vector max_type(mx+tisic); for(int i =0; i <= mx; i++) max_type[i] =i; queue q; for(int i =mx; i >= 0; i--) { map > G; ALL_THE(upd[i],it) { G[it->ff].push_back(it->ss); G[it->ss].push_back(it->ff);} map in_comp; vector< vector > comp; int C =0; ALL_THE(G,it) if(in_comp.find(it->ff) == in_comp.end()) { in_comp[it->ff] =C; q.push(it->ff); vector v; while(!q.empty()) { v.push_back(q.front()); ALL_THE(G[q.front()],jt) if(in_comp.find(*jt) == in_comp.end()) { in_comp[*jt] =C; q.push(*jt);} q.pop();} comp.push_back(v); C++;} for(int j =0; j < (int)comp.size(); j++) { int x =-1; ALL_THE(comp[j],jt) x =max(x,max_type[*jt]); ALL_THE(comp[j],jt) max_type[*jt] =x;} } long long ans =0; for(int i =0; i <= mx; i++) ans +=1LL*max_type[i]*tp[i]; printf("%lld\n",ans);} return 0;} // look at my code // my code is amazing