#include<fstream>
#include<iostream>
using namespace std;
#define IN "flood.in"
#define OUT "flood.out"
#define MaxN 1001
#define inf 10000
FILE *f, *g;
int coada[MaxN], viz[MaxN], i, j, n, bune, x, y, cnt, cost, proaste, Cost;
int p, q, k, minim, ceva1, ceva2;
bool a[MaxN][MaxN], viz2[MaxN];
struct{
int c; //cost
int x, y; //noduri unite
}C[MaxN][MaxN], v[MaxN];
void BFS(int start)
{
int p, u, i;
p=u=i=1;
coada[1]=start;
viz[start]=cnt;
while(p<=u)
{
for(i=1; i<=n; i++)
{
if(a[coada[p]][i]==1 && viz[i]==0)
{
viz[i]=cnt;
u++;
coada[u]=i;
}
}
p++;
}
}
int main()
{
f=fopen(IN, "r");
g=fopen(OUT, "w");
fscanf(f, "%d %d", &n, &bune);
for(i=1; i<=bune; i++)
{
fscanf(f, "%d %d", &x, &y);
a[x][y]=a[y][x]=1;
}
for(i=1; i<=n; i++)
{
if(viz[i]==0)
{
cnt++;
BFS(i);
}
}
fprintf(g, "%d\n", cnt-1);
fscanf(f, "%d", &proaste);
Cost=0;
for(i=1; i<=cnt; i++)
{
for(j=1; j<=cnt; j++)
C[i][j].c=inf;
C[i][i].c=0;
}
for(i=1; i<=proaste; i++)
{
fscanf(f, "%d %d %d", &x, &y, &cost);
if(viz[x]!=viz[y])
{
if(cost<=C[viz[x]][viz[y]].c)
{
C[viz[x]][viz[y]].c=cost;
C[viz[y]][viz[x]].c=cost;
C[viz[x]][viz[y]].x=x;
C[viz[y]][viz[x]].x=x;
C[viz[x]][viz[y]].y=y;
C[viz[y]][viz[x]].y=y;
}
}
}
for(k=1; k<=cnt-1; k++)
{
minim=inf;
for(i=1; i<=cnt-1; i++)
{
for(j=i+1; j<=cnt; j++)
{
if(C[i][j].c<minim && (viz2[i]+viz2[j]<=1))
{
minim=C[i][j].c;
p=i; q=j;
ceva1=C[i][j].x;
ceva2=C[i][j].y;
}
}
}
if(minim!=inf)
{
viz2[p]=1;
viz2[q]=1;
Cost+=minim;
v[k].x=ceva1; v[k].y=ceva2; v[k].c=minim;
}
}
fprintf(g, "%d\n", Cost);
for(i=1; i<=cnt-1; i++)
fprintf(g, "%d %d %d\n", v[i].x, v[i].y, v[i].c);
}