#include <iostream> #include <algorithm> #include <cstdio> #include <set> #include <cstring> using namespace std; const int maxn = 125; const int N = 10001; double d[maxn][N],pd[maxn][maxn],p[maxn]; bool vis[maxn][N]; int id[N]; int n,m; int R; double dp(int i,int j){ if(j==m-1||i>=R) return 1; if(vis[i][j]) return d[i][j]; vis[i][j]=true; d[i][j]=max((dp(i,j+1))*pd[i][id[j+1]],dp(id[j],j+1)*pd[id[j]][id[j+1]]); // cout<<d[i][j]<<" "<<i<<" "<<j<<endl; return d[i][j]; } int C(int i,int j){ int ans=1; for(int i=n;i>=n-2;i--) ans*=i; return ans/6; } int main() { while(scanf("%d",&n)==1){ R=C(n,3); for(int i=0;i<R;i++) for(int j=0;j<R;j++) scanf("%lf",&pd[i][j]); scanf("%d",&m); for(int i=0;i<m;i++) scanf("%d",&id[i]); memset(vis,false,sizeof(vis)); double res=0; //cout<<(1.0/R*1.0)<<endl; for(int i=0;i<R;i++){ res=max(res,dp(i,0)*(pd[i][id[0]])) ; } printf("%.6lf\n",res); } return 0; }