

Code: Select all
#include<bits/stdc++.h>
#define pi 2*acos(0.0)
#define PS system("pause")
#define siter(n) for(set<int>::iterator it=n.begin();it!=n.end();it++)
#define FOR(s,e,inc) for(int i=s;i<=e;i+=inc)
#define loop(i,a,b) for(int i=a;i<b;i++)
#define Sfor(n) for(int i=1;i<=n;i++)
#define inf (1<<30)
#define pb push_back
#define ppb pop_back
#define mp make_pair
#define F first
#define S second
#define sz(x) ((int)x.size())
#define eps 1e-9
#define gcd(x,y) __gcd(x,y)
#define lcm(a,b) (a*(b/gcd(a,b)))
#define on(x,w) x=x|(1<<w)
#define check(x,w) (x&(1<<w))==(1<<w)?true:false
#define all(x) (x).begin(),(x).end()
#define s(n) scanf("%d",&n)
#define sl(n) scanf("%lld",&n)
#define pf printf
#define ll long long int
#define MOD 1000000007
#define sqr(x) (( (x)* (x))%MOD)
#define cube(x) ( (sqr(x)*(x))%MOD)
#define bit_cnt(x) __builtin_popcount(x)
#define INT(c) ((int)((c) - '0'))
#define CHAR(i) ((char)(i + int('0')))
#define maxall(v) *max_element(all(v))
#define minall(v) *min_element(all(v))
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
#define btz(a) __builtin_ctz(a)
#define Mems(p,n) memset(p, n, sizeof(p))
#define makeint(n,s) istringstream(s)>>n
#define BOUNDARY(i,j,Row,Col) ((i >= 0 && i < Row) && (j >= 0 && j < Col))
#define M 1000009
using namespace std;
//int dx[]={1,0,-1,0};int dy[]={0,1,0,-1}; //4 Direction
//int dx[]={1,1,0,-1,-1,-1,0,1};int dy[]={0,1,1,1,0,-1,-1,-1}; //8 direction
//int dx[]={2,1,-1,-2,-2,-1,1,2};int dy[]={1,2,2,1,-1,-2,-2,-1}; //Knight Direction
//int dx[]={2,1,-1,-2,-1,1};int dy[]={0,1,1,0,-1,-1}; //Hexagonal Direction
typedef vector<int> vi;
template<class T>
inline bool fs(T &x)
{
int c=getchar();
int sgn=1;
while(~c&&c<'0'||c>'9')
{
if(c=='-')sgn=-1;
c=getchar();
}
for(x=0; ~c&&'0'<=c&&c<='9'; c=getchar())
x=x*10+c-'0';
x*=sgn;
return ~c;
}
//~~~~~~~~~~~~~~~~~CODE STARTING POINT~~~~~~~~~~~~~~~~~~~~~~
struct st
{
int u,v,w;
st (int a,int b,int c)
{
u=a;
v=b;
w=c;
}
bool operator <(const st &p)const
{
return w>p.w;
}
};
int par[M];
int rep(int n)
{
if(par[n]==n)
return n;
else
return par[n]=rep(par[n]);
}
int mst(int n,priority_queue<st> q)
{
ll cnt=0,sum=0;
int u,v;
for(int i=1;i<=n;i++)
par[i]=i;
while(!q.empty())
{
st top=q.top();
q.pop();
u=rep(top.u);
v=rep(top.v);
if(u!=v)
{
cnt++;
sum+=top.w;
par[u]=v;
if(cnt==n-1)
break;
}
}
return sum;
}
int main()
{
int n,m,a,b,c,k;
while(true)
{
priority_queue<st> B;
ll sum=0;
s(n);
loop(i,1,n)
{
s(a);
s(b);
s(c);
sum+=c;
}
s(k);
loop(i,0,k)
{
s(a);
s(b);
s(c);
B.push(st(a,b,c));
}
s(m);
loop(i,0,m)
{
s(a);
s(b);
s(c);
B.push(st(a,b,c));
}
cout<<sum<<endl;
cout<<mst(n,B)<<"\n\n";
}
return 0;
}