#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define fi first
#define se second
#define pb push_back
#define MAX 200200
struct segtree
{
int n;
vector<ll> st;
segtree(int _n)
{
n = _n;
st.resize(n*4,0);
}
void update(int id, int l, int r, int pos, int val)
{
if(l == r){
st[id] += val;
}else{
int m = (l+r)>>1;
if(pos <= m) update(id<<1,l,m,pos,val);
else update(id<<1|1,m+1,r,pos,val);
st[id] = st[id<<1] + st[id<<1|1];
}
}
ll get(int id, int l, int r, int u, int v)
{
if(r < u || v < l) return 0;
if(u <= l && r <= v) return st[id];
int m = (l+r)>>1;
return get(id<<1,l,m,u,v) + get(id<<1|1,m+1,r,u,v);
}
};
int n,m,q,root;
vector<pair<int,int> > adjj[MAX];
ll d[MAX];
int par[MAX], depth[MAX], sz[MAX], head[MAX], pos[MAX];
int cnt = 0;
vector<int> adj[MAX];
void nhap()
{
memset(d,0x3f,sizeof(d));
cin >> n >> m >> root >> q;
for(int i = 1; i<=m; i++){
int a,b,c; cin >> a >> b >> c;
adjj[a].pb({b,c});
adjj[b].pb({a,c});
}
}
void dijkstra()
{
d[root] = 0;
priority_queue<pair<ll,int>, vector<pair<ll,int> >, greater<pair<ll,int> > > pq;
pq.push({0,root});
while(!pq.empty()){
pair<ll,int> top = pq.top(); pq.pop();
if(top.fi != d[top.se]) continue;
for(pair<int,int> u : adjj[top.se]){
if(d[u.fi] > top.fi + u.se){
d[u.fi] = top.fi + u.se;
pq.push({d[u.fi], u.fi});
}
}
}
}
void pre_compute()
{
for(int i = 1; i<=n; i++) if(i != root){
int cur = n+1;
for(pair<int,int> u : adjj[i]) if(d[u.fi] + u.se == d[i]){
cur = min(cur, u.fi);
}
if(cur != n+1){
adj[cur].pb(i);
adj[i].pb(cur);
}
}
par[root] = 0;
depth[root] = 0;
}
void dfs(int v)
{
int ind = -1;
sz[v] = 1;
for(int i = 0; i<adj[v].size(); i++) if(adj[v][i] != par[v]){
int u = adj[v][i];
par[u] = v;
depth[u] = depth[v] +1;
dfs(u);
sz[v] += sz[u];
if(ind == -1 || sz[u] > sz[adj[v][ind]]) ind = i;
}
if(ind != -1 && ind != 0) swap(adj[v][0], adj[v][ind]);
}
void decompose(int v, int h)
{
head[v] = h;
pos[v] = ++cnt;
for(int u : adj[v]) if(u != par[v]){
if(u == adj[v][0]) decompose(u,h);
else decompose(u,u);
}
}
void process()
{
segtree st(n);
while(q--){
int t; cin >> t;
if(t == 1){
int u, val; cin >> u >> val;
st.update(1,1,n,pos[u],val);
}else{
int u, v; cin >> u >> v;
ll ans = 0;
while(head[u] != head[v]){
if(depth[head[u]] < depth[head[v]]) swap(u,v);
ans += st.get(1,1,n,pos[head[u]], pos[u]);
u = par[head[u]];
}
if(depth[u] > depth[v]) swap(u,v);
ans += st.get(1,1,n,pos[u], pos[v]);
cout << ans << '\n';
}
}
}
main()
{
ios_base::sync_with_stdio(0); cin.tie(0);
nhap();
dijkstra();
pre_compute();
dfs(root);
decompose(root,root);
process();
return 0;
}
I3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk8zIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk9mYXN0IikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoInVucm9sbC1sb29wcyIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgTUFYIDIwMDIwMAoKc3RydWN0IHNlZ3RyZWUKewogICAgaW50IG47CiAgICB2ZWN0b3I8bGw+IHN0OwogICAgc2VndHJlZShpbnQgX24pCiAgICB7CiAgICAgICAgbiA9IF9uOwogICAgICAgIHN0LnJlc2l6ZShuKjQsMCk7CiAgICB9CgogICAgdm9pZCB1cGRhdGUoaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCBwb3MsIGludCB2YWwpCiAgICB7CiAgICAgICAgaWYobCA9PSByKXsKICAgICAgICAgICAgc3RbaWRdICs9IHZhbDsKICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgaW50IG0gPSAobCtyKT4+MTsKICAgICAgICAgICAgaWYocG9zIDw9IG0pIHVwZGF0ZShpZDw8MSxsLG0scG9zLHZhbCk7CiAgICAgICAgICAgIGVsc2UgdXBkYXRlKGlkPDwxfDEsbSsxLHIscG9zLHZhbCk7CiAgICAgICAgICAgIHN0W2lkXSA9IHN0W2lkPDwxXSArIHN0W2lkPDwxfDFdOwogICAgICAgIH0KICAgIH0KCiAgICBsbCBnZXQoaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCB1LCBpbnQgdikKICAgIHsKICAgICAgICBpZihyIDwgdSB8fCB2IDwgbCkgcmV0dXJuIDA7CiAgICAgICAgaWYodSA8PSBsICYmIHIgPD0gdikgcmV0dXJuIHN0W2lkXTsKICAgICAgICBpbnQgbSA9IChsK3IpPj4xOwogICAgICAgIHJldHVybiBnZXQoaWQ8PDEsbCxtLHUsdikgKyBnZXQoaWQ8PDF8MSxtKzEscix1LHYpOwogICAgfQp9OwoKaW50IG4sbSxxLHJvb3Q7CnZlY3RvcjxwYWlyPGludCxpbnQ+ID4gYWRqaltNQVhdOwpsbCBkW01BWF07CmludCBwYXJbTUFYXSwgZGVwdGhbTUFYXSwgc3pbTUFYXSwgaGVhZFtNQVhdLCBwb3NbTUFYXTsKaW50IGNudCA9IDA7CnZlY3RvcjxpbnQ+IGFkaltNQVhdOwoKdm9pZCBuaGFwKCkKewogICAgbWVtc2V0KGQsMHgzZixzaXplb2YoZCkpOwogICAgY2luID4+IG4gPj4gbSA+PiByb290ID4+IHE7CiAgICBmb3IoaW50IGkgPSAxOyBpPD1tOyBpKyspewogICAgICAgIGludCBhLGIsYzsgY2luID4+IGEgPj4gYiA+PiBjOwogICAgICAgIGFkampbYV0ucGIoe2IsY30pOwogICAgICAgIGFkampbYl0ucGIoe2EsY30pOwogICAgfQp9Cgp2b2lkIGRpamtzdHJhKCkKewogICAgZFtyb290XSA9IDA7CiAgICBwcmlvcml0eV9xdWV1ZTxwYWlyPGxsLGludD4sIHZlY3RvcjxwYWlyPGxsLGludD4gPiwgZ3JlYXRlcjxwYWlyPGxsLGludD4gPiA+IHBxOwogICAgcHEucHVzaCh7MCxyb290fSk7CiAgICB3aGlsZSghcHEuZW1wdHkoKSl7CiAgICAgICAgcGFpcjxsbCxpbnQ+IHRvcCA9IHBxLnRvcCgpOyBwcS5wb3AoKTsKICAgICAgICBpZih0b3AuZmkgIT0gZFt0b3Auc2VdKSBjb250aW51ZTsKICAgICAgICBmb3IocGFpcjxpbnQsaW50PiB1IDogYWRqalt0b3Auc2VdKXsKICAgICAgICAgICAgaWYoZFt1LmZpXSA+IHRvcC5maSArIHUuc2UpewogICAgICAgICAgICAgICAgZFt1LmZpXSA9IHRvcC5maSArIHUuc2U7CiAgICAgICAgICAgICAgICBwcS5wdXNoKHtkW3UuZmldLCB1LmZpfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCnZvaWQgcHJlX2NvbXB1dGUoKQp7CiAgICBmb3IoaW50IGkgPSAxOyBpPD1uOyBpKyspIGlmKGkgIT0gcm9vdCl7CiAgICAgICAgaW50IGN1ciA9IG4rMTsKICAgICAgICBmb3IocGFpcjxpbnQsaW50PiB1IDogYWRqaltpXSkgaWYoZFt1LmZpXSArIHUuc2UgPT0gZFtpXSl7CiAgICAgICAgICAgIGN1ciA9IG1pbihjdXIsIHUuZmkpOwogICAgICAgIH0KICAgICAgICBpZihjdXIgIT0gbisxKXsKICAgICAgICAgICAgYWRqW2N1cl0ucGIoaSk7CiAgICAgICAgICAgIGFkaltpXS5wYihjdXIpOwogICAgICAgIH0KICAgIH0KICAgIHBhcltyb290XSA9IDA7CiAgICBkZXB0aFtyb290XSA9IDA7Cn0KCnZvaWQgZGZzKGludCB2KQp7CiAgICBpbnQgaW5kID0gLTE7CiAgICBzelt2XSA9IDE7CiAgICBmb3IoaW50IGkgPSAwOyBpPGFkalt2XS5zaXplKCk7IGkrKykgaWYoYWRqW3ZdW2ldICE9IHBhclt2XSl7CiAgICAgICAgaW50IHUgPSBhZGpbdl1baV07CiAgICAgICAgcGFyW3VdID0gdjsKICAgICAgICBkZXB0aFt1XSA9IGRlcHRoW3ZdICArMTsKICAgICAgICBkZnModSk7CiAgICAgICAgc3pbdl0gKz0gc3pbdV07CiAgICAgICAgaWYoaW5kID09IC0xIHx8IHN6W3VdID4gc3pbYWRqW3ZdW2luZF1dKSBpbmQgPSBpOwogICAgfQogICAgaWYoaW5kICE9IC0xICYmIGluZCAhPSAwKSBzd2FwKGFkalt2XVswXSwgYWRqW3ZdW2luZF0pOwp9Cgp2b2lkIGRlY29tcG9zZShpbnQgdiwgaW50IGgpCnsKICAgIGhlYWRbdl0gPSBoOwogICAgcG9zW3ZdID0gKytjbnQ7CiAgICBmb3IoaW50IHUgOiBhZGpbdl0pIGlmKHUgIT0gcGFyW3ZdKXsKICAgICAgICBpZih1ID09IGFkalt2XVswXSkgZGVjb21wb3NlKHUsaCk7CiAgICAgICAgZWxzZSBkZWNvbXBvc2UodSx1KTsKICAgIH0KfQoKdm9pZCBwcm9jZXNzKCkKewogICAgc2VndHJlZSBzdChuKTsKICAgIHdoaWxlKHEtLSl7CiAgICAgICAgaW50IHQ7IGNpbiA+PiB0OwogICAgICAgIGlmKHQgPT0gMSl7CiAgICAgICAgICAgIGludCB1LCB2YWw7IGNpbiA+PiB1ID4+IHZhbDsKICAgICAgICAgICAgc3QudXBkYXRlKDEsMSxuLHBvc1t1XSx2YWwpOwogICAgICAgIH1lbHNlewogICAgICAgICAgICBpbnQgdSwgdjsgY2luID4+IHUgPj4gdjsKICAgICAgICAgICAgbGwgYW5zID0gMDsKICAgICAgICAgICAgd2hpbGUoaGVhZFt1XSAhPSBoZWFkW3ZdKXsKICAgICAgICAgICAgICAgIGlmKGRlcHRoW2hlYWRbdV1dIDwgZGVwdGhbaGVhZFt2XV0pIHN3YXAodSx2KTsKICAgICAgICAgICAgICAgIGFucyArPSBzdC5nZXQoMSwxLG4scG9zW2hlYWRbdV1dLCBwb3NbdV0pOwogICAgICAgICAgICAgICAgdSA9IHBhcltoZWFkW3VdXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZihkZXB0aFt1XSA+IGRlcHRoW3ZdKSBzd2FwKHUsdik7CiAgICAgICAgICAgIGFucyArPSBzdC5nZXQoMSwxLG4scG9zW3VdLCBwb3Nbdl0pOwogICAgICAgICAgICBjb3V0IDw8IGFucyA8PCAnXG4nOwogICAgICAgIH0KICAgIH0KfQoKIG1haW4oKQp7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKDApOwogICAgbmhhcCgpOwogICAgZGlqa3N0cmEoKTsKICAgIHByZV9jb21wdXRlKCk7CiAgICBkZnMocm9vdCk7CiAgICBkZWNvbXBvc2Uocm9vdCxyb290KTsKICAgIHByb2Nlc3MoKTsKICAgIHJldHVybiAwOwp9Cg==