/*
首先有gcd的性质
gcd(a1,a2...) = gcd(a1,a2+a1...)
本题要求所有f(S)的gcd,可以转化成找所有单位点集的gcd
什么是单位点集? 右侧两个点a,b相邻点集想等,则这两个点在同一个集合内
证明:所有不同的f(S)都可以由单位点集的f(S)凑出来
*/
#include<bits/stdc++.h>
using namespace std;
#define N 500005
#define ll long long
ll n,m,c[N];
vector<ll>G[N];
map<vector<ll>,ll> mp;
int main(){
int t;cin>>t;
while(t--){
mp.clear();
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)scanf("%lld",&c[i]);
for(int i=1;i<=n;i++)G[i].clear();
for(int i=1;i<=m;i++){
int u,v;scanf("%d%d",&u,&v);
G[v].push_back(u);
}
for(int i=1;i<=n;i++)
sort(G[i].begin(),G[i].end());
for(int i=1;i<=n;i++)
mp[G[i]]+=c[i];
ll ans=0;
for(auto p:mp){
vector<ll> v=p.first;
if(v.size()==0)continue;
else ans=__gcd(ans,p.second);
}
cout<<ans<<'\n';
}
}