#include <bits/stdc++.h>
using namespace std;
inline bool ig(char c) { return c >= '0' && c <= '9'; }
inline void read(int &oi) {
  char c;
  int f = 1, res = 0;
  while (c = getchar(), (!ig(c)) && c != '-')
    ;
  c == '-' ? f = -1 : res = (c ^ 48);
  while (c = getchar(), ig(c)) res = res * 10 + (c ^ 48);
  oi = f * res;
}
inline void print(int oi) {
  if (oi < 0) putchar('-'), oi = ~oi + 1;
  if (oi > 9) print(oi / 10);
  putchar(oi % 10 + 48);
}
int n, m, ans;
struct Edge {
  int x, y, z;
  bool operator<(const Edge &b) const { return z > b.z; }
} e[200005];
int fa[200005];
bool s[200005];
inline int gfa(int u) { return u ^ fa[u] ? fa[u] = gfa(fa[u]) : u; }
int main() {
  read(n);
  read(m);
  for (int i = 1; i <= m; ++i) read(e[i].x), read(e[i].y), read(e[i].z);
  sort(e + 1, e + 1 + m);
  for (int i = 1; i <= n; ++i) fa[i] = i, s[i] = true;
  for (int i = 1; i <= m; ++i) {
    int fx = gfa(e[i].x), fy = gfa(e[i].y);
    if ((fx ^ fy) && (s[fx] || s[fy]))
      ans += e[i].z, fa[fx] = fy, s[fy] = s[fy] & s[fx];
    else if (!(fx ^ fy) && s[fx])
      s[fx] = false, ans += e[i].z;
  }
  print(ans);
  putchar('\n');
  return 0;
}
