#include<bits/stdc++.h>
#define int long long
#define O() puts("")
#define o() printf(" ")
#define in(x) scanf("%lld",&x)
#define out(x) printf("%lld ",x)
#define OUT(x) printf("%lld\n",x)
#define fr(x,y,z) for(int x=y;x<=z;x++)
#define rf(x,y,z) for(int x=y;x>=z;x--)
const int maxn=2e2+10;
const int maxm=6e3+10;
using namespace std;
int n,m;
int cnt;
int sum;
int ans[maxm];
bool tag[maxn];
bool use[maxn];
struct Disjoint_set_data_structure {
int fa[maxn];
void init(int Max) {
fr(i,1,Max) fa[i]=i;
}
int find(int x) {
return x==fa[x] ? x : fa[x]=find(fa[x]);
}
void merge(int x,int y) {
if(find(x)^find(y)) fa[find(y)]=find(x);
}
} ds;
struct node {
int u;
int v;
int w;
int id;
friend bool operator <(node a,node b) {
return a.w<b.w;
}
} e[maxm];
int Kruskal() {
ds.init(n);
sum=cnt=0;
fr(i,1,m) {
if(tag[e[i].id]) continue;
if(ds.find(e[i].u)^ds.find(e[i].v)) {
cnt++;
sum+=e[i].w;
use[e[i].id]=true;
ds.merge(e[i].u,e[i].v);
}
if(cnt==n-1) {
return sum;
}
}
return -1ll;
}
void init() {
in(n),in(m);
fr(i,1,m) ans[i]=-1ll;
fr(i,1,m) in(e[i].u),in(e[i].v),in(e[i].w),e[i].id=i;
sort(e+1,e+1+m);
}
void answer() {
ans[m]=Kruskal();
rf(i,m-1,1) {
if(i<n-1) break;
tag[i+1]=true;
if(use[i+1]) ans[i]=Kruskal();
else ans[i]=ans[i+1];
if(ans[i]==-1) break;
}
}
void print() {
fr(i,1,m) OUT(ans[i]);
}
signed main() {
freopen("P1340_2.in","r",stdin);
init();
answer();
print();
return 0;
}