def solve(n, g, h): inf = -10 ** 18 h.append(-1) def check(x): L = [[inf, inf] for _ in range(n + 1)] R = [[-inf, -inf] for _ in range(n + 1)] # L[i][0] <= t[i] <= R[i][0] に対して、 # 2 * t[i] # L[i][1] <= t[i] <= R[i][1] に対して、 # 2 * t[i] + 1 の時刻に到達可能 h[n] = x for i in g[n]: L[i][1] = 0 R[i][1] = 0 for time in range(n * 2): for u in range(n + 1): for v in g[u]: if h[u] == h[v]: if h[u] <= x: for t in range(2): L[v][t^1] = min(L[v][t^1], L[u][t] + t) R[v][t^1] = max(R[v][t^1], R[u][t] + t) elif h[u] > h[v]: Y = (x - h[u]) // (h[u] - h[v]) # 2s + t <= Y # min(R[v][t], (Y - t) // 2) for t in range(2): y = (Y - t) // 2 L[v][t^1] = min(L[v][t^1], L[u][t] + t) R[v][t^1] = max(R[v][t^1], min(R[u][t] + t, y)) else: Y = (x - h[u] - 1) // (h[u] - h[v]) + 1 # 2s + t >= Y # max(L[v][t], (Y - t + 1) // 2 for t in range(2): y = (Y - t + 1) // 2 L[v][t^1] = min(L[v][t^1], max(L[u][t] + t, y)) R[v][t^1] = max(R[v][t^1], R[u][t] + t) # print(time) # print(L) # print(R) return all(L[i][0] <= R[i][0] or L[i][1] <= R[i][1] for i in range(n)) ok = 10 ** 13 ng = -1 while ok - ng > 1: mid = (ok + ng) // 2 res = check(mid) # print(mid, res) # print() if res: ok = mid else: ng = mid return ok for _ in range(int(input())): n, m = map(int, input().split()) h = list(map(int, input().split())) g = [[] for _ in range(n + 1)] for _ in range(m): u, v = map(int, input().split()) u -= 1 v -= 1 g[u].append(v) g[v].append(u) print(solve(n, g, h))