#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
#define Mid ((l+r)>>1)
#define lson rt<<1,l,Mid
#define rson rt<<1|1,Mid+1,r
const int maxn=100000+10;
int to[maxn*2],nex[maxn*2],w[maxn*2],beg[maxn];
struct edege{int e1,e2;}e[maxn];
int no[maxn];
int a[maxn];
int fa[maxn],dis[maxn],size[maxn],son[maxn],top[maxn];
int id[maxn],rank[maxn];
int Sum[maxn*4];
int n,q,s,cnt,tot;
void add(int x,int y,int z){
to[++tot]=y;
nex[tot]=beg[x];
beg[x]=tot;
w[tot]=z;
}
void dfs1(int rt,int ba){
size[rt]=1; dis[rt]=dis[ba]+1;
for(int i=beg[rt] ; i ; i=nex[i]){
int u=to[i];
if(u!=ba){
a[u]=w[i];
fa[u]=rt; dfs1(u,rt);
size[rt]+=size[u];
if(size[u]>size[son[rt]])son[rt]=u;
}
}
}
void dfs2(int rt,int tp){
top[rt]=tp;
id[++cnt]=rt; rank[rt]=cnt;
if(son[rt])dfs2(son[rt],tp);
for(int i=beg[rt];i;i=nex[i]){
int u=to[i];
if(u!=son[rt] && u!=fa[rt])dfs2(u,u);
}
}
void update(int rt,int l,int r,int pos,int num){
if(l == r && r == pos)
Sum[rt] = num;
else{
if( pos <= Mid)
update(lson,pos,num);
if( pos > Mid)
update(rson,pos,num);
Sum[rt] =Sum[rt<<1]+Sum[rt<<1|1];
}
}
int query(int rt,int l,int r,int L,int R){
if(L <= l && r <= R)
return Sum[rt];
else{
int tmp=0;
if( L <= Mid)
tmp += query(lson,L,R);
if( R > Mid)
tmp += query(rson,L,R);
return tmp;
}
}
int main(){
int rt;
cin>>n>>q>>s;
for(int i=1;i<n;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z); add(y,x,z);
e[i].e1=x; e[i].e2=y;
}
dfs1(s,0);
for(int i=1;i<n;i++){
if(dis[e[i].e1]>dis[e[i].e2])no[i]=e[i].e1;
else no[i]=e[i].e2;
}
dfs2(s,s);
for(int i=1;i<=n;i++)update(1,1,n,rank[i],a[i]);
int last=s;
for(int i=1;i<=q;i++){
int o,x,y;
scanf("%d",&o);
if(o==0){
scanf("%d",&x);
int u=last,v=x;
int ans=0;
while(top[u]!=top[v]){
if(dis[top[u]]<dis[top[v]]){
int tmp=u; u=v; v=tmp;
}
//ans+=sum(rank[u])-sum(rank[top[u]]-1);
ans += query(1,1,n,rank[top[u]],rank[u]);
u=fa[top[u]];
}
if(dis[u]<dis[v]){
int tmp=u; u=v; v=tmp;
}
//ans+=sum(rank[u])-sum(rank[v]);
ans += query(1,1,n,rank[v]+1,rank[u]);
last=x;
printf("%d\n",ans);
}else{
scanf("%d%d",&x,&y);
update(1,1,n,rank[no[x]],-a[no[x]]);
update(1,1,n,rank[no[x]],y);
a[no[x]]=y;
}
}
return 0;
}