#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cmath>
const int maxn = 200000;
typedef int sz[maxn];
int n, m, num, i, st[maxn], l, r; sz e, next, first, prev, rd, u, us; double k[maxn], b[maxn], bs[maxn]; char ch;
void link(int x, int y) {e[++num] = y, next[num] = first[x], first[x] = num;}
void change(int x, int z)
{
u[x] += z, us[prev[x]] += z;
for (; prev[x]; x = prev[x])
{
bs[prev[x]] -= b[x];
b[x] = k[x] * (u[x] + bs[x] - us[x]);
bs[prev[x]] += b[x];
}
}
double ask(int x)
{
for (st[0] = 0; x; st[++st[0]] = x, x = prev[x]);
int y = e[next[first[st[st[0]]]]];
double ans = (b[y] - u[y])/ (2 - k[y]);
for (x = st[0] - 1; x; --x)
ans = k[st[x]] * ans + b[st[x]];
return ans;
}
int main()
{
freopen("circuit.in", "r", stdin);
freopen("circuit.out", "w", stdout);
scanf("%d%d", &n, &m);
for (i = 1; i < n; ++i)
{
int x, y;
scanf("%d%d\n", &x, &y);
link(x, y), link(y, x);
++rd[x], ++rd[y];
}
for (i = 1; i <= n; ++i)
if (rd[i] == 1) break;
prev[0] = -1;
link(i, 0), link(0, i);
for (st[l = r = 1] = 0; l <= r; ++l)
for (int p = first[st[l]]; p; p = next[p])
if (e[p] != prev[st[l]])
prev[st[++r] = e[p]] = st[l];
for (i = r; i > 2; --i)
if (rd[st[i]] == 1) k[st[i]] = 0.5; else
{
double m1 = rd[st[i]];
for (int p = first[st[i]]; p; p = next[p])
if (e[p] != prev[st[i]]) m1 -= k[e[p]];
k[st[i]] = 1/m1;
}
int x, y, z;
for (i = 1; i <= m; ++i)
{
scanf("%c", &ch);
if (ch == 'Q')
{
scanf("%d\n", &x);
printf("%.10lf\n", ask(x));
} else
{
scanf("%d%d%d\n", &x, &y, &z);
if (prev[x] == y) y = x, z = -z;
change(y, z);
}
}
return 0;
}
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cmath>
const int maxn = 200000;
typedef int sz[maxn];
int n, m, num, i, st[maxn], l, r; sz e, next, first, prev, rd, u, us; double k[maxn], b[maxn], bs[maxn]; char ch;
void link(int x, int y) {e[++num] = y, next[num] = first[x], first[x] = num;}
void change(int x, int z)
{
u[x] += z, us[prev[x]] += z;
for (; prev[x]; x = prev[x])
{
bs[prev[x]] -= b[x];
b[x] = k[x] * (u[x] + bs[x] - us[x]);
bs[prev[x]] += b[x];
}
}
double ask(int x)
{
for (st[0] = 0; x; st[++st[0]] = x, x = prev[x]);
int y = e[next[first[st[st[0]]]]];
double ans = (b[y] - u[y])/ (2 - k[y]);
for (x = st[0] - 1; x; --x)
ans = k[st[x]] * ans + b[st[x]];
return ans;
}
int main()
{
freopen("circuit.in", "r", stdin);
freopen("circuit.out", "w", stdout);
scanf("%d%d", &n, &m);
for (i = 1; i < n; ++i)
{
int x, y;
scanf("%d%d\n", &x, &y);
link(x, y), link(y, x);
++rd[x], ++rd[y];
}
for (i = 1; i <= n; ++i)
if (rd[i] == 1) break;
prev[0] = -1;
link(i, 0), link(0, i);
for (st[l = r = 1] = 0; l <= r; ++l)
for (int p = first[st[l]]; p; p = next[p])
if (e[p] != prev[st[l]])
prev[st[++r] = e[p]] = st[l];
for (i = r; i > 2; --i)
if (rd[st[i]] == 1) k[st[i]] = 0.5; else
{
double m1 = rd[st[i]];
for (int p = first[st[i]]; p; p = next[p])
if (e[p] != prev[st[i]]) m1 -= k[e[p]];
k[st[i]] = 1/m1;
}
int x, y, z;
for (i = 1; i <= m; ++i)
{
scanf("%c", &ch);
if (ch == 'Q')
{
scanf("%d\n", &x);
printf("%.10lf\n", ask(x));
} else
{
scanf("%d%d%d\n", &x, &y, &z);
if (prev[x] == y) y = x, z = -z;
change(y, z);
}
}
return 0;
}