#include <bits/stdc++.h> // NeOWami
using namespace std;
// _oo0oo_
// o8888888o
// 88" . "88
// (| -_- |)
// 0\ = /0
// ___/`---'\___
// .' \\| |// '.
// / \\||| : |||// \
// / _||||| -:- |||||- \
// | | \\\ - /// | |
// | \_| ''\---/'' |_/ |
// \ .-\__ '-' ___/-. /
// ___'. .' /--.--\ `. .'___
// ."" '< `.___\_<|>_/___.' >' "".
// | | : `- \`.;`\ _ /`;.`/ - ` : | |
// \ \ `_. \_ __\ /__ _/ .-` / /
// =====`-.____`.___ \_____/___.-`___.-'=====
// `=---='
//
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Phật phù hộ, không bao giờ BUG
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#define ft first
#define sc second
#define int long long
using pii = pair<int, int>;
const int N = 2e5 + 5;
const int MOD = 998244353;
void add(int &u, int v) {
u += v;
if (u >= MOD) u -= MOD;
}
int n, m;
int a[N];
int valEdge[N];
vector<pii> G[N];
pii E[N];
map<int, int> dp[N];
int DP(int id) {
if (valEdge[id] != -1) return valEdge[id];
int u = E[id].ft, v = E[id].sc;
int need = a[v] - a[u], val = 0;
if (need >= 1) {
if (!dp[u].count(need)) {
int cnt = 0;
for (int id = lower_bound(G[u].begin(), G[u].end(), (pii){need, 0}) - G[u].begin(); id < G[u].size() && G[u][id].ft == need; id++) add(cnt, DP(G[u][id].sc));
dp[u][need] = cnt;
val = cnt;
}
else val = dp[u][need];
}
return valEdge[id] = (val + 1) % MOD;
}
void solve(){
int ans = 0;
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= m; i++) {
int u, v; cin >> u >> v;
G[v].push_back({a[u], i});
E[i] = {u, v};
valEdge[i] = -1;
}
for (int i = 1; i <= n; i++) sort(G[i].begin(), G[i].end());
for (int i = 1; i <= m; i++) add(ans, DP(i));
for (int i = 1; i <= n; i++) {
G[i].clear();
dp[i].clear();
}
cout << ans << "\n";
}
signed main() {
cin.tie(NULL)->sync_with_stdio(false);
if(ifstream("Input.inp")) {
freopen("Input.inp", "r", stdin);
freopen("Output.out", "w", stdout);
}
int tt;
cin >> tt;
while(tt--){
solve();
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IC8vIE5lT1dhbWkKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLy8gICAgICAgICAgICAgICAgICAgICAgIF9vbzBvb18KLy8gICAgICAgICAgICAgICAgICAgICAgbzg4ODg4ODhvCi8vICAgICAgICAgICAgICAgICAgICAgIDg4IiAuICI4OAovLyAgICAgICAgICAgICAgICAgICAgICAofCAtXy0gfCkKLy8gICAgICAgICAgICAgICAgICAgICAgMFwgID0gIC8wCi8vICAgICAgICAgICAgICAgICAgICBfX18vYC0tLSdcX19fCi8vICAgICAgICAgICAgICAgICAgLicgXFx8ICAgICB8Ly8gJy4KLy8gICAgICAgICAgICAgICAgIC8gXFx8fHwgIDogIHx8fC8vIFwKLy8gICAgICAgICAgICAgICAgLyBffHx8fHwgLTotIHx8fHx8LSBcCi8vICAgICAgICAgICAgICAgfCAgIHwgXFxcICAtICAvLy8gfCAgIHwKLy8gICAgICAgICAgICAgICB8IFxffCAgJydcLS0tLycnICB8Xy8gfAovLyAgICAgICAgICAgICAgIFwgIC4tXF9fICAnLScgIF9fXy8tLiAvCi8vICAgICAgICAgICAgIF9fXycuIC4nICAvLS0uLS1cICBgLiAuJ19fXwovLyAgICAgICAgICAuIiIgJzwgIGAuX19fXF88fD5fL19fXy4nID4nICIiLgovLyAgICAgICAgIHwgfCA6ICBgLSBcYC47YFwgXyAvYDsuYC8gLSBgIDogfCB8Ci8vICAgICAgICAgXCAgXCBgXy4gICBcXyBfX1wgL19fIF8vICAgLi1gIC8gIC8KLy8gICAgID09PT09YC0uX19fX2AuX19fIFxfX19fXy9fX18uLWBfX18uLSc9PT09PQovLyAgICAgICAgICAgICAgICAgICAgICAgYD0tLS09JwovLwovLyAgICAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci8vICAgICAgICAgICAgUGjhuq10IHBow7kgaOG7mSwga2jDtG5nIGJhbyBnaeG7nSBCVUcKLy8gICAgIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgoKI2RlZmluZSBmdCBmaXJzdAojZGVmaW5lIHNjIHNlY29uZAojZGVmaW5lIGludCBsb25nIGxvbmcKdXNpbmcgcGlpID0gcGFpcjxpbnQsIGludD47CmNvbnN0IGludCBOID0gMmU1ICsgNTsKY29uc3QgaW50IE1PRCA9IDk5ODI0NDM1MzsKdm9pZCBhZGQoaW50ICZ1LCBpbnQgdikgewogICAgdSArPSB2OwogICAgaWYgKHUgPj0gTU9EKSB1IC09IE1PRDsKfQppbnQgbiwgbTsKaW50IGFbTl07CmludCB2YWxFZGdlW05dOwp2ZWN0b3I8cGlpPiBHW05dOwpwaWkgRVtOXTsKbWFwPGludCwgaW50PiBkcFtOXTsKCmludCBEUChpbnQgaWQpIHsKICAgIGlmICh2YWxFZGdlW2lkXSAhPSAtMSkgcmV0dXJuIHZhbEVkZ2VbaWRdOwogICAgaW50IHUgPSBFW2lkXS5mdCwgdiA9IEVbaWRdLnNjOwogICAgaW50IG5lZWQgPSBhW3ZdIC0gYVt1XSwgdmFsID0gMDsKICAgIGlmIChuZWVkID49IDEpIHsKICAgICAgICBpZiAoIWRwW3VdLmNvdW50KG5lZWQpKSB7CiAgICAgICAgICAgIGludCBjbnQgPSAwOwogICAgICAgICAgICAKICAgICAgICAgICAgZm9yIChpbnQgaWQgPSBsb3dlcl9ib3VuZChHW3VdLmJlZ2luKCksIEdbdV0uZW5kKCksIChwaWkpe25lZWQsIDB9KSAtIEdbdV0uYmVnaW4oKTsgaWQgPCBHW3VdLnNpemUoKSAmJiBHW3VdW2lkXS5mdCA9PSBuZWVkOyBpZCsrKSBhZGQoY250LCBEUChHW3VdW2lkXS5zYykpOwogICAgICAgICAgICBkcFt1XVtuZWVkXSA9IGNudDsKICAgICAgICAgICAgdmFsID0gY250OwogICAgICAgIH0KICAgICAgICBlbHNlIHZhbCA9IGRwW3VdW25lZWRdOwogICAgfSAKICAgIHJldHVybiB2YWxFZGdlW2lkXSA9ICh2YWwgKyAxKSAlIE1PRDsKfQp2b2lkIHNvbHZlKCl7CiAgICBpbnQgYW5zID0gMDsKICAgIGNpbiA+PiBuID4+IG07CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIGNpbiA+PiBhW2ldOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbTsgaSsrKSB7CiAgICAgICAgaW50IHUsIHY7IGNpbiA+PiB1ID4+IHY7CiAgICAgICAgR1t2XS5wdXNoX2JhY2soe2FbdV0sIGl9KTsKICAgICAgICBFW2ldID0ge3UsIHZ9OwogICAgICAgIHZhbEVkZ2VbaV0gPSAtMTsKICAgIH0KICAgIAogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSBzb3J0KEdbaV0uYmVnaW4oKSwgR1tpXS5lbmQoKSk7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBtOyBpKyspIGFkZChhbnMsIERQKGkpKTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewogICAgICAgIEdbaV0uY2xlYXIoKTsKICAgICAgICBkcFtpXS5jbGVhcigpOwogICAgfQogICAgY291dCA8PCBhbnMgPDwgIlxuIjsKfQoKc2lnbmVkIG1haW4oKSB7CiAgICBjaW4udGllKE5VTEwpLT5zeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgaWYoaWZzdHJlYW0oIklucHV0LmlucCIpKSB7CiAgICAgICAgZnJlb3BlbigiSW5wdXQuaW5wIiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3BlbigiT3V0cHV0Lm91dCIsICJ3Iiwgc3Rkb3V0KTsKICAgIH0KCiAgICBpbnQgdHQ7CiAgICBjaW4gPj4gdHQ7CiAgICB3aGlsZSh0dC0tKXsKICAgICAgICBzb2x2ZSgpOwogICAgfQogICAgCiAgICByZXR1cm4gMDsKfQ==