#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
const int M = 1e6 + 5;
struct edge {
  int nxt, to, len;
} e[N];
int fir[N], n;
priority_queue<pair<long long, int>, vector<pair<long long, int> >,
               greater<pair<long long, int> > >
    pq;
int head[M], lst[M], nxt[M], key[M], cnt, delta[N];
int k, tot;
long long dis[N], INF;
bool inq[N];
inline void Dijkstra() {
  memset(dis, 0x3f, sizeof(long long) * (n + 2));
  INF = dis[0];
  dis[1] = 0;
  pq.push(make_pair(0LL, 1));
  pair<long long, int> x;
  while (!pq.empty()) {
    x = pq.top();
    pq.pop();
    if (inq[x.second]) continue;
    inq[x.second] = 1;
    dis[x.second] = x.first;
    for (int i = fir[x.second]; i; i = e[i].nxt)
      pq.push(make_pair(dis[x.second] + e[i].len, e[i].to));
  }
}
inline void push(int st, int node) {
  cnt++;
  nxt[cnt] = 0;
  key[cnt] = node;
  if (!head[st])
    head[st] = cnt;
  else
    nxt[lst[st]] = cnt;
  lst[st] = cnt;
}
inline void refresh() {
  memset(delta, 0x3f, sizeof(int) * (n + 2));
  memset(inq, 0, sizeof(bool) * (n + 2));
  memset(head, 0, sizeof(int) * (tot + 2));
  cnt = 0;
  int mx = 0, x;
  push(0, 1);
  delta[1] = 0;
  for (int i = 0; i <= mx; i++) {
    for (int w = head[i]; w; w = nxt[w]) {
      x = key[w];
      if (inq[x]) continue;
      dis[x] += i;
      inq[x] = 1;
      for (int j = fir[x]; j; j = e[j].nxt)
        if (delta[e[j].to] > dis[x] + e[j].len - dis[e[j].to]) {
          delta[e[j].to] = dis[x] + e[j].len - dis[e[j].to];
          if (delta[e[j].to] <= tot) {
            push(delta[e[j].to], e[j].to);
            mx = max(mx, delta[e[j].to]);
          }
        }
    }
  }
}
inline int read() {
  int x = 0;
  char ch;
  while (!isdigit(ch = getchar()))
    ;
  while (isdigit(ch)) {
    x = (x << 1) + (x << 3) + ch - '0';
    ch = getchar();
  }
  return x;
}
int main() {
  int m, q, opt, l, x, y;
  bool update = 0;
  n = read();
  m = read();
  q = read();
  for (int i = 1; i <= m; i++) {
    x = read();
    y = read();
    l = read();
    e[i] = (edge){fir[x], y, l};
    fir[x] = i;
  }
  Dijkstra();
  while (q--) {
    opt = read();
    k = read();
    if (opt == 1) {
      if (update) refresh();
      update = 0;
      tot = 0;
      if (dis[k] < INF)
        printf("%lld\n", dis[k]);
      else
        puts("-1");
    } else {
      update = 1;
      tot += k;
      while (k--) {
        x = read();
        e[x].len++;
      }
    }
  }
  return 0;
}
