//zoj2326Tangled in Cables
//用给定长度的绳子将村里的房屋连起来,房屋可视为点
//每一对房屋之间只有一条路,我用的是Kruscal
//zoj的平台好强大。。。。。。
//cmp函数定义返回值为整数,当我返回实数时
//(return(p1->length-p2->length))就WA。。囧
//if(p1->length>p2->length)
// return 1;
// else return -1;
//改成这样就AC了。。。
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#define maxint 1000
typedef struct point
{
int s,e;
float length;
}epoint;
epoint side[maxint];
int v[maxint];
int cmp(const void *a,const void *b)
{
epoint *p1,*p2;
p1=(epoint*)a;
p2=(epoint*)b;
if(p1->length>p2->length)
return 1;
else return -1;
}
int find(int i)
{
while(v[i]!=i)
i=v[i];
return i;
}
float kruscal(int n,int m)
{
int i,j=0,v1,v2;
float sum=0.0;
for(i=0;i<m;i++)
{
v1=find(side[i].s);
v2=find(side[i].e);
if(v1!=v2)
{
sum+=side[i].length;
v[v1]=v2;
j++;
if(j==n-1)
break;
}
}
return sum;
}
int main()
{
float cable,val,sum;
char name[maxint][22],name1[22],name2[22];
int n,m,r,c,i,j;
while(scanf("%f",&cable)!=EOF)
{
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%s",name[i]);
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%s",name1);
scanf("%s",name2);
scanf("%f",&val);
for(j=0;j<n;j++)
if(!strcmp(name1,name[j]))
{
r=j;
break;
}
for(j=0;j<n;j++)
if(!strcmp(name2,name[j]))
{
c=j;
break;
}
side[i].e=c;
side[i].s=r;
side[i].length=val;
}
for(i=0;i<n;i++)
v[i]=i;
qsort(side,m,sizeof(epoint),cmp);
sum=kruscal(n,m);
if(sum>cable)
printf("Not enough cable\n");
else
printf("Need %.1f miles of cable\n",sum);
}
return 0;
}