#include <bits/stdc++.h>
using namespace std;
template <class T>
inline T pow2(T a) {
  return a * a;
}
template <class T>
inline bool mineq(T& a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
const int maxn = (int)1e5 + 10;
;
struct edge {
  int a, b, id;
  long double w;
  bool cap;
} edges[maxn];
int n, m, k, pr[maxn];
long double mid;
vector<int> ans;
bool cmp(edge a, edge b) {
  return a.w + (a.cap ? mid : (long double)0) <
         b.w + (b.cap ? mid : (long double)0);
}
int afhadsh(int a) { return (pr[a] == a ? a : pr[a] = afhadsh(pr[a])); }
int check(bool f) {
  ans.clear();
  for (int i = 0; i < maxn; i++) pr[i] = i;
  sort(edges, edges + m, cmp);
  int ret = 0, cnt = 0;
  for (int i = 0; i < m; i++) {
    int a = afhadsh(edges[i].a);
    int b = afhadsh(edges[i].b);
    if (a != b && (!f || !edges[i].cap || ret < k)) {
      cnt++;
      if (edges[i].cap) ret++;
      ans.push_back(edges[i].id);
      pr[a] = b;
    }
  }
  if (cnt != n - 1) return -1;
  return ret;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> m >> k;
  int last = 0;
  for (int i = 0; i < m; i++) {
    cin >> edges[i].a >> edges[i].b >> edges[i].w;
    edges[i].cap = (edges[i].a == 1 || edges[i].b == 1);
    edges[i].id = i;
  }
  long double lo = -2e5, hi = 2e5;
  while (hi - lo > 1e-14) {
    mid = (lo + hi) / 2;
    int t = check(false);
    if (t == k) break;
    if (t > k) {
      lo = mid;
    } else {
      hi = mid;
    }
  }
  if (check(true) != k) {
    cout << -1;
    return 0;
  }
  cout << n - 1 << endl;
  for (int i = 0; i < n - 1; i++) cout << ans[i] + 1 << " ";
}
