#include <cstdio>
#include <vector>
#include <algorithm>
#include <tuple>
using namespace std;

class union_find{
public:
  vector<int> uf;
  union_find(int n){
    uf=vector<int>(n);
    for(int i=0;i<n;i++){
      uf[i]=-1;
    }
  }
  int root(int i)
  {
    return uf[i]<0?i:uf[i]=root(uf[i]);
  }
  void unite(int i,int j)
  {
    if(-uf[i]<-uf[j]){
      uf[i]=j;
    }
    else if(-uf[i]>-uf[j]){
      uf[j]=i;
    }
    else{
      uf[i]=j;
      uf[j]--;
    }
  }
};

int main()
{
  int n,h,w;
  scanf("%d%d%d",&n,&h,&w);
  vector<tuple<long long,int,int> > E(n);
  for(int i=0;i<n;i++){
    int r,c;
    long long A;
    scanf("%d%d%lld",&r,&c,&A);
    r--,c--;
    E[i]=make_tuple(A,r,h+c);
  }
  sort(E.begin(),E.end());
  long long ans=0ll;
  union_find uf(h+w);
  vector<int> tree(h+w,true);
  for(int i=n-1;i>=0;i--){
    long long A=get<0>(E[i]);
    int a=get<1>(E[i]),b=get<2>(E[i]);
    a=uf.root(a),b=uf.root(b);
    if(a!=b&&(tree[a]||tree[b])){
      bool t=(tree[a]&&tree[b]);
      uf.unite(a,b);
      tree[uf.root(a)]=t;
      ans+=A;
      //printf("%d %d %lld\n",a,b,A);
    }
    else if(tree[a]){
      tree[a]=false;
      ans+=A;
      //printf("%d %d %lld\n",a,b,A);
    }
  }
  printf("%lld\n",ans);
  return 0;
}
