/*
ID: niepeng1
PROG: fence6
LANG: C++
*/
#include <stdio.h>
#define Max1 102
#define MMax 0x7fffffff
struct Node{
int link[2][10];
int len;
};
Node map[Max1];
int minlen = MMax;
bool cond[Max1]={false};
int n;
int min,start;
int check0(int i,int j)
{
int k;
for(k=1;k<=map[i].link[0][0];k++)
{
if( j == map[i].link[0][k])
return 1;
}
for(k=1;k<=map[i].link[1][0];k++)
{
if( j == map[i].link[1][k])
return 0;
}
return -1;
}
void Dfs(int i,int j,int len)
{
int a;
if(check0(j,i)==-1)
return;
if(check0(j,i) == 1)//k的入数组里面有k,那么在出数组里面继续画圈
{
for(a=1;a<=map[j].link[1][0];a++)
{
if( !cond[map[j].link[1][a]] )
{
cond[map[j].link[1][a]]=true;
if( minlen > len+map[j].len)
Dfs(j,map[j].link[1][a],len+map[j].len);
cond[map[j].link[1][a]]=false;
}
else
if( minlen > len+map[j].len)
{
if(map[j].link[1][a] == start)
{
minlen=len+map[j].len;
}
}
}
}
else
{
for(a=1;a<=map[j].link[0][0];a++)
{
if( !cond[map[j].link[0][a]] )
{
cond[map[j].link[0][a]]=true;
if( minlen > len+map[j].len)
Dfs(j,map[j].link[0][a],len+map[j].len);
cond[map[j].link[0][a]]=false;
}
else
if( minlen > len+map[j].len)
{
if(map[j].link[0][a] == start)
{
minlen=len+map[j].len;
}
}
}
}
}
int main ()
{
int i,tem,j;
FILE *in = fopen ("fence6.in", "r");
FILE *out = fopen ("fence6.out", "w");
fscanf(in,"%d",&n);
for(i=1;i<=n;i++)
{
fscanf(in,"%d",&tem);
fscanf(in,"%d%d%d",&map[tem].len,&map[tem].link[0][0],&map[tem].link[1][0]);
for(j=1;j<=map[tem].link[0][0];j++)
{
fscanf(in,"%d",&map[tem].link[0][j]);
}
for(j=1;j<=map[tem].link[1][0];j++)
{
fscanf(in,"%d",&map[tem].link[1][j]);
}
}
for(i=1;i<=n;i++)
{
start=i;
cond[i]=true;
for(j=1;j<=map[i].link[0][0];j++)
Dfs(i,map[i].link[0][j],map[i].len);
for(j=1;j<=map[i].link[1][0];j++)
Dfs(i,map[i].link[1][j],map[i].len);
cond[i]=false;
}
fprintf(out,"%d/n",minlen);
fclose(in);fclose(out);
return 0;
}