#include <bits/stdc++.h>
using namespace std;
const int maxm = 1000 * 100 + 10, maxn = 5000 + 10, OO = 1000 * 1000;
vector<pair<int, pair<int, int> > > edge;
vector<int> ans;
int par[maxn];
double w[maxm];
int n, m, k;
int findP(int v) {
  if (par[v] < 0) return v;
  return par[v] = findP(par[v]);
}
bool merge(int u, int v) {
  u = findP(u), v = findP(v);
  if (u == v) return false;
  if (par[u] < par[v]) swap(u, v);
  par[v] += par[u];
  par[u] = v;
  return true;
}
void input() {
  cin >> n >> m >> k;
  for (int i = 0; i < m; i++) {
    int u, v;
    cin >> u >> v >> w[i];
    u--, v--;
    edge.push_back(make_pair(i, make_pair(min(u, v), max(v, u))));
  }
}
bool cmp(pair<int, pair<int, int> > e1, pair<int, pair<int, int> > e2) {
  if (w[e1.first] == w[e2.first]) {
    if (e1.second.first == e2.second.first)
      return (e1.second.second < e2.second.second);
    return (e1.second.first < e2.second.first);
  }
  return (w[e1.first] < w[e2.first]);
}
pair<int, int> check(double T, bool mod) {
  int sum = 0, num = 0;
  memset(par, -1, sizeof par);
  ans.clear();
  for (auto &e : edge)
    if (e.second.first == 0) w[e.first] += T;
  sort(edge.begin(), edge.end(), cmp);
  for (auto &e : edge) {
    if (e.second.first == 0) w[e.first] -= T;
    if (mod && num == k && e.second.first == 0) continue;
    if (merge(e.second.first, e.second.second)) {
      ans.push_back(e.first);
      if (e.second.first == 0) num++;
      sum++;
    }
  }
  return make_pair(num, sum);
}
int main() {
  input();
  double hi = OO, low = -OO;
  while (hi - low > 1) {
    double mid = (hi + low) / 2;
    pair<int, int> z = check(mid, 0);
    if (z.first < k)
      hi = mid;
    else if (z.first > k)
      low = mid;
    else {
      low = mid;
      break;
    }
  }
  pair<int, int> z = check(low, 1);
  if (z.first < k || z.second < n - 1)
    cout << -1;
  else {
    cout << n - 1 << "\n";
    for (auto &e : ans) cout << e + 1 << " ";
  }
  return 0;
}
