#include <bits/stdc++.h>
using namespace std;
#include <string.h>
#include <iomanip>   
#include <map>
#define MEM(var, val) memset(var, (val), sizeof(var))
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define nitro                         \
    ios_base::sync_with_stdio(false); \
    cin.tie(NULL);                    \
    cout.tie(NULL);
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll> pll;
typedef vector<ll> vll;
#define mp make_pair
#define pb push_back
#define F first
#define S second
//*max_element(a.begin(), a.end())
vll t,a;
vector<vll> adj;

void build(ll i, ll l,ll r)
{
    if(l==r)
    {
        t[i]=a[l];
        return;
    }
    ll mid=(l+r)/2;
    build(2*i,l,mid);
    build(2*i+1,mid+1,r);
    t[i]=t[2*i]*t[2*i+1];
    return;

}
void update(ll i,ll l,ll r,ll pos,ll val)
{
    if(l==r)
    {t[i]=val;
    return ;
    }
    ll mid=(l+r)/2;
    
    if(pos>mid)
    update(2*i+1,mid+1,r,pos,val);
    else 
    update(2*i,l,mid,pos,val);
    t[i]=t[2*i]*t[2*i+1];
    return ;
}
ll getval(ll i,ll l,ll r,ll p1,ll p2)
{
    if(p1==l&&p2==r)
    return t[i];
    ll mid=(l+r)/2;
    if(p1>mid)
        return getval(2*i+1,mid+1,r,p1,p2);
        else if(p2<=mid)
        return getval(2*i,l,mid,p1,p2);
        else return getval(2*i,l,mid,p1,mid)*getval(2*i+1,mid+1,r,mid+1,p2);
}
vll enter,leave;
ll timer=1;
void dfs(ll v, ll p)
{
    enter[v]=timer;
    for(int u : adj[v])
    {
        if(u!=p)
            {
                timer++;
                dfs(u,v);
            }
    }
    leave[v]=timer;
    return ;
}
int main()
{
    ll n;
    ll q;
    cin>>n;
    a.resize(n+1,1);
   adj.resize(n+1);
   for(int i=0;i<n-1;i++)
   {
       ll a,b;
       cin>>a>>b;
       adj[a].pb(b);
       adj[b].pb(a);
   }
   enter.resize(n+1);
   leave.resize(n+1);
    dfs(1,0);
    t.resize(4*n+1,0);
    build(1,1,n);
    // for(int i=1;i<=4*n;i++)
    // cout<<t[i]<<" ";
   
    cin>>q;
    ll t1,x,y;
    for(int i=0;i<q;i++)
    {
        cin>>t1>>x>>y;
        if(t1==1)
        update(1,1,n,enter[x],y);
        else {
            ll p1,p2;
            p1=enter[x];
            p2=leave[x];
            long  double ans=getval(1,1,n,p1,p2)+0.0;
             
            p1=enter[y];
            p2=leave[y];
            ans=(ans+0.0)/(getval(1,1,n,p1,p2)+0.0);
             cout<<std::fixed;
            ans=ans+0.0;
            if(ans>1e9)
            cout<<"1000000000\n";
            else cout<<setprecision(10)<<ans<<"\n";
        }       
    }
    // for(int i=1;i<=4*n;i++)
    // cout<<t[i]<<" ";
}