#include <bits/stdc++.h>
using namespace std;
int n, m, k, ans, toK;
vector<int> pa, ra;
set<int> setT;
struct node {
  int x, y, w, p, id;
  bool operator<(const node &B) const { return p == B.p ? x < B.x : p < B.p; }
} e[100005];
int find(int x) { return x == pa[x] ? x : pa[x] = find(pa[x]); }
void Union(int u, int v) {
  int pu = find(u), pv = find(v);
  if (ra[pu] > ra[pv]) {
    ra[pu] += ra[pv];
    pa[pv] = pu;
  } else {
    ra[pv] += ra[pu];
    pa[pu] = pv;
  }
}
void Kruskal(int mid) {
  for (int i = 1; i <= m; i++) e[i].p = e[i].w + (e[i].x == 1 ? mid : 0);
  sort(e + 1, e + 1 + m);
  pa.assign(n + 1, 0);
  ra.assign(n + 1, 1);
  for (int i = 1; i <= n; i++) pa[i] = i;
  ans = toK = 0;
  setT.clear();
  for (int i = 1; i <= m && (int)setT.size() < n - 1; i++) {
    int px = find(e[i].x);
    int py = find(e[i].y);
    if ((px != py) && (toK + (e[i].x == 1) <= k)) {
      Union(px, py);
      ans += e[i].p;
      toK += (e[i].x == 1);
      setT.insert(e[i].id);
    }
  }
}
int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> n >> m >> k;
  for (int i = 1; i <= m; i++) {
    cin >> e[i].x >> e[i].y >> e[i].w;
    e[i].id = i;
    if (e[i].x > e[i].y) swap(e[i].x, e[i].y);
  }
  Kruskal(-100000);
  if ((int)setT.size() < n - 1 || toK < k) {
    cout << "-1\n";
    return 0;
  }
  int l = -100000, r = 100000;
  while (l < r) {
    int mid = (r + l + 1) >> 1;
    Kruskal(mid);
    if (toK >= k)
      l = mid;
    else
      r = mid - 1;
  }
  Kruskal(l);
  cout << n - 1 << "\n";
  set<int>::iterator it;
  for (it = setT.begin(); it != setT.end(); it++) cout << *it << ' ';
}
