struct node {
int start;
int end;
int cost;
};
int N, M;
vector<node> graph;
int par[100002];
int a, b, c;
bool cmp(node a, node b)
{
return a.cost < b.cost;
}
int find(int x)
{
if (par[x] == x)
return x;
else
return par[x] = find(par[x]);
}
void merge(int x, int y)
{
x = find(x);
y = find(y);
par[y] = x;
}
int main()
{
cin.tie(0);
ios_base::sync_with_stdio(false);
cout.tie(0);
cin >> N >> M;
for (int i = 1; i <= N; i++)
par[i] = i;
for(int i = 0;i < M;i++)
{
cin >> a >> b >> c;
node A = { a, b,c };
graph.push_back(A);
}
sort(graph.begin(), graph.end(), cmp);
int ans = 0;
for (int i = 0; i < graph.size(); i++)
{
int aa = find(graph[i].start);
int bb = find(graph[i].end);
if (aa == bb)
continue;
else
{
int cc = graph[i].cost;
ans += cc;
merge(graph[i].start, graph[i].end);
}
}