/*
TASK:food
LANG:C++
*/
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int n,m,i1,jj; //bf - za dadena promociq za dadena hrana kolko ob6to 6te struva
int bf[80][80],pf[80][80][80],pp[80][80]; //pf - za seki 2 promocii zeti zaedno koq hrana kolko ob6to 6te struva
//pp - za seki 2 promocii zaedno kolko 6te struvat
long fd[80],pr[80],c[80];
//fd - cenata na dadena hrana; pr - otstupkata na dadena promociq; c - deistvitelnata cena na dadena promociq
vector<int> f[80]; //pd - hranite v dadena prmociq
int e[80]; //ot koe nivo e dadenata kombinaciq

void ob6tp(int a,int b)
{    int i; pp[a][b]=0;
     for (int i=1; i<=n; i++)
      { pf[a][b][i]=(bf[a][i]>bf[b][i])?bf[a][i]:bf[b][i];
        pf[b][a][i]=pf[a][b][i]; pp[a][b]+=pf[b][a][i];}
     pp[a][b]-=pr[a]+pr[b];   
 }

int main()
{
    long i,j,k,l;
//    ifstream f1("food.in0");
    cin>>n>>m;
    for (i=1; i<=n; i++)
     cin>>fd[i]; 
    for (i=1; i<=m; i++)
     {
      cin>>pr[i]>>k; e[i]=1; c[i]=0;
      for (j=0; j<k; j++) { cin>>l; f[i].push_back(l); bf[i][l]=fd[l]; c[i]+=fd[l]; }
      c[i]-=pr[i];
//      sort(f[i].begin(),f[i].end());
     } 
//    f1.close();
    
    bool fl=false;
    long ans=1000000000,ia=0;
    pp[79][79]=ans; c[79]=ans;
    
    while (true)
    {
    i1=79; jj=79;
    //namiram koi 2 nai-dobre se kombinirat
    for (i=1; i<=m; i++) if (e[i]>0) 
     for (j=1; j<=m; j++) if ((e[j]>0)&&(i!=j)&&((e[i]!=e[j])||(e[i]==1)))
      { ob6tp(i,j); if ((pp[i1][jj]>pp[i][j])&&(pp[i][j]<c[i])&&(pp[i][j]<c[j])) { i1=i; jj=j;} }
    if (i1==79) break; 
    //kombiniram gi v i1
    c[i1]=pp[i1][jj];
    if (c[i1]<ans) { ans=c[i1]; ia=i1; }
    pr[i1]=pr[i1]+pr[jj];
    for (i=1; i<=n; i++)
     bf[i1][i]=pf[i1][jj][i];
    e[i1]=(e[jj]>e[i1])?e[jj]+1:e[i1]+1; e[jj]=0;
    }
    
/*    for (i=1; i<=m; i++) {
     for (j=0; j<f[i].size(); j++) cout<<f[i][j]<<" ";
     cout<<endl; } */
    if (ans>0) ans=0;
    cout<<abs(ans)<<"\n";
    
//    system("pause");
    return 0;
}
