#include <bits/stdc++.h> using namespace std; using ll = long long; using i64 = long long; #define var auto struct unionfind { vector<int> s; unionfind(int n): s(n, -1) { } int root(int u) { return s[u] >= 0 ? (s[u] = root(s[u])) : u; } void unite(int u, int v) { u = root(u); v = root(v); if (u == v) return ; if (s[u] < s[v]) swap(u, v); s[v] += s[u]; s[u] = v; } }; int main() { cin.tie(0)->sync_with_stdio(false); int n, m; cin >> n >> m; vector<int> a(m); vector<int> b(m); for (int i = 0; i < m; i++) { cin >> a[i] >> b[i]; a[i]--, b[i]--; } vector<int> c(n); for (int i = 0; i < n; i++) { cin >> c[i]; c[i]--; } vector<ll> w(10); for (int i = 0; i < 10; i++) { cin >> w[i]; } int q; cin >> q; vector<int> us(q); vector<int> vs(q); for (int i = 0; i < q; i++) { cin >> us[i] >> vs[i]; us[i]--, vs[i]--; } const ll inf = 1e18; vector<ll> ans(q, inf); for (int i = 1; i < 1024; i++) { ll cost = 0; for (int j = 0; j < 10; j++) { if (i >> j & 1) cost += w[j]; } unionfind uf(n); for (int j = 0; j < m; j++) { if ((i >> c[a[j]] & 1) && (i >> c[b[j]] & 1)) { uf.unite(a[j], b[j]); } } for (int j = 0; j < q; j++) { if (uf.root(us[j]) == uf.root(vs[j])) { ans[j] = min(ans[j], cost); } } } for (int i = 0; i < q; i++) { cout << (ans[i]<inf?ans[i]:-1) << "\n"; } }