#include<bits/stdc++.h>
#define maxn 100010
#define ll long long
using namespace std;
const ll inf=0x3f3f3f3f3f3f3f3f;
int n,m,q,cnt;
bool vis[maxn];
ll dis[maxn];
int head[maxn];
ll mmax;
queue<int>qq[maxn];
ll f[maxn];
struct EdgE{
int to,nxt;
ll val;
}edge[maxn];
void addedge(int from,int to,ll val){
cnt++;
edge[cnt].nxt=head[from];
edge[cnt].to=to;
edge[cnt].val=val;head[from]=cnt;return;
}
void dj(){
memset(vis,0,sizeof(vis));
memset(f,0x3f,sizeof f);
priority_queue< pair < ll , ll > >q;
f[1]=0;
q.push((make_pair(0ll,1ll)));
while(!q.empty()){
int now=q.top().second;q.pop();
if(vis[now])continue;
vis[now]=1;
for(int i=head[now];i;i=edge[i].nxt){
int to=edge[i].to;
int val=edge[i].val;
if(dis[now]+val<dis[to]){
dis[to]=dis[now]+val;
q.push((make_pair(dis[to],to)));
}
}
}
return;
}
void solve(int suibian1234){
memset(f,0x3f,sizeof(f));
mmax=0ll;f[1]=0;qq[0].push(1);
for(int i=0;i<=mmax;++i){
while(!qq[i].empty()){
int now=qq[i].front();qq[i].pop();
if(f[now]<i)continue;
for(int j=head[now];j;j=edge[j].nxt){
int to=edge[j].to;
ll val=edge[j].val;
ll delta=dis[now]+val-dis[to];
if(f[to]>f[now]+delta){
f[to]=f[now]+delta;
if(f[to]<=suibian1234){
qq[f[to]].push(to);
mmax=max(mmax,f[to]);
}
}
}
}
}
return;
}
int main(){
cin>>n>>m>>q;
for(int i=1;i<=m;i++){
int a,b,c;cin>>a>>b>>c;
addedge(a,b,c);
}
memset(dis,0x3f,sizeof(dis));
dis[1]=0ll;dj();
for(int i=1;i<=q;i++){
int op;cin>>op;
if(op==1){
int v;cin>>v;
if(dis[v]!=inf)cout<<(dis[v])<<'\n';
else {puts("-1");}
}
else{
int c;cin>>c;
for(int j=1;j<=c;++j){
int l;cin>>l;
edge[l].val++;
}
memset(f,0x3f,sizeof f);
solve(min(c,n-1));
for(int j=1;j<=n;j++)dis[j]=min(inf,dis[j]+f[j]);
}
}
return 0;
}