#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;
const long long L = 1e18 + 18;
int Z;
struct edge {
  int s;
  int t;
  long long W;
  int ind;
  edge(int a, int b, long long c, int I) {
    s = a;
    t = b;
    W = c;
    ind = I;
  }
};
struct cmp {
  bool operator()(edge a, edge b) { return a.W > b.W; }
};
long long odl[N];
vector<edge> G[N];
vector<pair<long long, long long> > D[N];
void dfs(int v, int oj, int k);
int main() {
  Z = 0;
  int n, m, k;
  scanf("%d%d%d", &n, &m, &k);
  for (long long i = 1; i <= n; i++) odl[i] = L;
  for (long long i = 1; i <= m; i++) {
    long long a, b, c;
    scanf("%lld%lld%lld", &a, &b, &c);
    G[a].push_back(edge(a, b, c, i));
    G[b].push_back(edge(b, a, c, i));
  }
  priority_queue<edge, vector<edge>, cmp> kol;
  odl[1] = 0;
  for (auto z : G[1]) kol.push(z);
  while (!kol.empty()) {
    edge X = kol.top();
    kol.pop();
    if (odl[X.t] < L) continue;
    odl[X.t] = X.W;
    D[X.s].push_back(make_pair(X.t, X.ind));
    for (auto z : G[X.t]) {
      if (odl[z.t] > X.W + z.W) {
        kol.push(edge(z.s, z.t, z.W + X.W, z.ind));
      }
    }
  }
  k = min(k, n - 1);
  printf("%d\n", k);
  dfs(1, 1, k);
  if (k > 0) printf("\n");
}
void dfs(int v, int oj, int k) {
  for (auto z : D[v]) {
    if (z.first == oj) continue;
    if (Z >= k) break;
    printf("%lld ", z.second);
    Z++;
    dfs(z.first, v, k);
  }
}
