#include #include #include #include using namespace std; long long n,m,i,j,c[65],k,x,y,z[65][16],min1,minp,used[65],ans,minans,br,e; vector > zz[16]; pair a[16][65]; void rec(long long p) { if(br>10000001) {e=1; return ;} if(e==1) return ; if(p==m+1) {if(minans>ans) minans=ans; return ;} int m=zz[p].size(); int k=0; for(int i=0; i<=m-1; i++) { br++; ans+=zz[p][i].first+(used[zz[p][i].second]==0?c[zz[p][i].second]:0); k=used[zz[p][i].second]; used[zz[p][i].second]=1; rec(p+1); if(e==1) return ; used[zz[p][i].second]=k; ans-=zz[p][i].first+(used[zz[p][i].second]==0?c[zz[p][i].second]:0); } } int main() { freopen("materials.in","r",stdin); freopen("materials.out","w",stdout); scanf("%lld%lld",&n,&m); for(i=1; i<=n; i++) { scanf("%lld",&c[i]); } minans=2000000001; for(i=1; i<=n; i++) { scanf("%lld",&k); for(j=1; j<=k; j++) { scanf("%lld%lld",&x,&y); z[i][x]=y; zz[x].push_back(make_pair(y,i)); } } rec(1); printf("%lld\n",minans); return 0; }