/*
TASK: food
LANG:C++
*/


#include <cstdio>
#include <cstring>

#define MN      80

struct P {
    int val;
    char p[16];
    P(){ memset(p,0,sizeof(p)); }
    
    void operator=(const P& x){
        val=x.val;
        for (int i=0;i<16;++i)
            p[i]=x.p[i];
    }

    bool operator!=(const P& x) const {
        for (int i=0;i<16; ++i) if (p[i]!=x.p[i]) return true;
        return false;
    }
};

int c[MN];
P pr[MN];
int n,m;



P sech;

inline void doSech(const P& x,const P& y)
{
    for (int i=0;i<16; ++i)
        sech.p[i] = x.p[i] & y.p[i];
}


void print(P &x)
{
    for (int i=0;i<16;++i) {
        for (int j=0; j<8; ++j)
            if (x.p[i]&(1<<j))
                printf("%d,",8*i+j);
    }
    printf("\n");
}

int main()
{
    FILE *fin=stdin;//fopen("food.in","r");

    fscanf(fin,"%d %d",&n,&m);
    int i,j,k,x;


    for (i=1;i<=n;++i) fscanf(fin,"%d",&c[i]);
    for (i=1;i<=m;++i) {
        fscanf(fin,"%d %d",&pr[i].val,&k);
        while (k--) {
            fscanf(fin,"%d",&x);
            pr[i].p[x>>3] |= 1<<(x&7);
        }
    }

    //fclose(fin);



    int val[MN],ind;
    int mx=0;

    for (i=1;i<=m; ++i) {
        val[i]=pr[i].val;

        for (j=1;j<=m;++j) {
            if (i==j) continue;

            doSech(pr[i],pr[j]);
            if (sech!=pr[j]) continue;

            //printf ("%d %d\n",i,j);
            val[i]+=pr[j].val;
        }
            

        for (ind=0;ind<16;++ind) {
            for (j=0; j<8; ++j)
                if (pr[i].p[ind]&(1<<j))
                    val[i] -= c[ind*8+j];
        }
        
        //pq.insert(Obj(val[i],pr[i]));
        //printf("%d\n",val[i]);
        mx >?= val[i];
    }

    printf("%d\n",mx);

    return 0;
}
