#include <bits/stdc++.h>
using namespace std;

#define pb push_back
#define ll long long

struct edge{
	int u, v, c;
};

const int maxn = 2e5 + 5;
int n, m, root[maxn];
vector<edge> edges;

bool cmp(edge x, edge y) {
	return x.c < y.c;
}

struct dsu{
	void init(int n) {
		for (int i = 1; i <= n; ++i)
			root[i] = i;
	}

	int find(int u) {
		return (u == root[u] ? u : root[u] = find(root[u]));
	}

	bool join(int u, int v) {
		u = find(u); v = find(v);
		if (u == v) return false;
		root[v] = u;
		return true;
	}
} dsu;

void solve() {
	cin >> n >> m;
	dsu.init(n);
	for (int i = 1; i <= m; ++i) {
		int u, v;
		cin >> u >> v;
		dsu.join(u, v);
	}

	for (int i = 1; i <= n; ++i)
		for (int j = 1; j <= n; ++j) {
			int x; cin >> x;
			if (i == j) continue;
			if (i < j) edges.pb({i, j, x});
		}

	ll ans = 0;
	sort(edges.begin(), edges.end(), cmp);
	for (auto e: edges) {
		if (!dsu.join(e.u, e.v)) continue;
		ans += e.c;
	}

	cout << ans;
}

signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    solve();
    
    return 0;
}

