PreTOI15_02_03

                Never    
C++
       
#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
typedef pair<lli,lli> pii;
typedef pair<lli,pii> plp;
typedef pair<plp,lli> ppp;
#define INF 1e9

lli maxll(lli a, lli b){
    return (a > b)? a : b;
}

lli minll(lli a, lli b){
    return (a < b)? a : b;
}

lli n,m;
vector<ppp> edges;
vector<lli> parent(100002,0);

lli Find(lli x){
    if(x != parent[x]){
        return parent[x] = Find(parent[x]);
    }

    return x;
}

void Union(lli a, lli b){
    parent[Find(b)] = Find(a);

    return;
}

int main(int argc, char* argv[]){

    for(lli i = 0 ; i < 100002; ++i){
        parent[i] = i;
    }

    cin >> n >> m;
    
    for(lli i = 0 ; i < m; ++i){
        lli u,v,w;
        cin >> u >> v >> w;
        edges.push_back(ppp(plp(w,pii(u,v)),i));
    }
    lli t;
    cin >> t;
    if(m < n){
        cout << -1 << endl;
        return 0;
    }
    sort(edges.begin(),edges.end());

    lli sum = 0;
    vector<lli> ans;
    for(lli i = m-1 ; i >= 0; --i){
        lli w = (edges[i]).first.first;
        lli u = (edges[i]).first.second.first;
        lli v = (edges[i]).first.second.second;
        lli ind = (edges[i]).second;
        //cout << w << " " << u << " " << v << " " << ind << " ";
        if((Find(u) != Find(v))){
            Union(u,v);
            sum += w;
            ans.push_back(ind);
            edges[i] = ppp(plp(w,pii(-INF,-INF)),-INF);
            //cout << "Sum = " << sum;
            Find(u);
            Find(v);
        }//cout << endl;
        if(ans.size() == n-1){
            break;
        } 
        
    }
    lli par = Find(1);
    //cout << par << " ";
    for(lli i = 2 ; i <= n; ++i){
        //cout << Find(i) << " ";
        if(Find(i) != par){
            cout << -1 << endl;
            return 0;
            par = -INF;
            //break;
        }
    }//cout << endl;
    if(ans.size() != n-1){
        cout << -1 << endl;
        return 0;
    }

    for(lli i = m-1 ; i >= 0; --i){
        if((edges[i]).second != -INF){
            sum += (edges[i]).first.first;
            ans.push_back((edges[i]).second);
            break;
        }
    }

    cout << sum << endl;
        
    if(t == 2){
        for(lli i = 0 ; i < ans.size(); ++i){
            cout << ans[i]+1 << " ";
        }cout << endl;
    }
    

    return 0;
}

Raw Text