#include <bits/stdc++.h>
using namespace std;
const int MAX = 200007;
const int B = 1000;
const int CNT_LONG = 200000 / B + 10;
vector<int> WAY[MAX];
bool is_long[MAX];
vector<int> Long;
int cnt[CNT_LONG][MAX];
vector<int> g[MAX];
bool u[MAX];
long long add[MAX], x[MAX], sum[MAX];
int main()
{
int n, m, k;
cin >> n >> m >> k;
for(int i = 0; i < n - 1; i++)
{
int u, v;
scanf("%d %d", &u, &v);
-- u;
-- v;
g[u].push_back(v);
g[v].push_back(u);
}
for(int i = 0; i < m; i++)
{
int c;
scanf("%d", &c);
WAY[i].resize(c);
for(int j = 0; j < c; j++)
{
scanf("%d", &WAY[i][j]);
WAY[i][j]--;
}
if (c >= B)
{
is_long[i] = true;
Long.push_back(i);
}
}
for(int i = 0; i < (int)Long.size(); i++)
{
int id = Long[i];
for(int j = 0; j < n; j++)
u[j] = false;
for(int v : WAY[id])
u[v] = true;
for(int j = 0; j < m; j++)
for(int v : WAY[j])
if (u[v])
cnt[i][j]++;
}
for(int num = 0; num < k; num++)
{
int id;
char t[4];
scanf("%s %d", t, &id);
-- id;
if (t[0] == '+')
{
int val;
scanf("%d", &val);
if (is_long[id])
{
add[id] += val;
}
else
{
for(int v : WAY[id]) x[v] += val;
}
for(int j = 0; j < (int)Long.size(); j++)
sum[Long[j]] += cnt[j][id] * (long long) val;
}
else
{
if (is_long[id])
{
printf("%lld\n", sum[id]);
}
else
{
long long res = 0;
for(int v : WAY[id]) res += x[v];
for(int j = 0; j < (int)Long.size(); j++) res += add[Long[j]] * cnt[j][id];
printf("%lld\n", res);
}
}
}
return 0;
}