#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
#ifdef DEBUG
#define display(x) cerr << #x << " = " << x << endl;
#define displaya(a, st, n)\
	{cerr << #a << " = {";\
	for(int qwq = (st); qwq <= (n); ++qwq) {\
		if(qwq == (st)) cerr << a[qwq];\
		else cerr << ", " << a[qwq];\
	} cerr << "}" << endl;}
#define displayv(v) displaya(v, 0, (int)(v).size() - 1)
#define eprintf(...) fprintf(stderr, __VA_ARGS__)
#else
#define display(x) ;
#define displaya(a, st, n) ;
#define displayv(v) ;
#define eprintf(...) if(0) fprintf(stderr, "...")
#endif
template<typename T> bool chmin(T &a, const T &b) { return a > b ? a = b, true : false; }
template<typename T> bool chmax(T &a, const T &b) { return a < b ? a = b, true : false; }

const int maxN = 2 * 100000 + 233;
int n;
int pa[maxN], mk[maxN];
vector< pair<int, pii> > ve;

int findset(int x) { return pa[x] == x ? x : pa[x] = findset(pa[x]); }

int main() {
#ifndef LOCAL
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
#endif
	cin >> n;
	int h, w; cin >> h >> w;
	for(int i = 1; i <= h + w; ++i) pa[i] = i, mk[i] = 0;
	for(int i = 1; i <= n; ++i) {
		int x, y, a;
		cin >> x >> y >> a;
		ve.emplace_back(a, pii(x + w, y));
	}
	sort(ve.begin(), ve.end());
	reverse(ve.begin(), ve.end());
	LL ans = 0;
	for(auto e : ve) {
		int x = e.second.first, y = e.second.second;
		x = findset(x); y = findset(y);
		if(x == y) {
			if(!mk[x]) mk[x] = 1, ans += e.first;
		} else if(mk[x] + mk[y] <= 1) {
			pa[x] = y;
			mk[y] |= mk[x];
			ans += e.first;
		}
	}
	cout << ans << endl;
	return 0;
}
