{
TASK:food
LANG:PASCAL
}
program food;
var
  Pr: array[1..75, 1..75] of Byte;
  PCost, Cost: array[1..75] of LongInt;
  FPCount: array[1..75] of 1..10;
  Counter: array[1..75] of Boolean;
  N, M: Integer;

procedure InputData;
var
  I, J, F, buf: Integer;
  c: String;
begin
  ReadLn(N, M);
  for I := 1 to N do
    ReadLn(Cost[I]);
  for I := 1 to M do
  begin
    for J := 1 to N do
      Pr[I,J] := 0;
    Read(PCost[I], F);
    FPCount[I] := F;
    for J := 1 to F do
    begin
      Read(buf);
      Pr[I,J] := buf;
    end;
  end;
end;

function NextFood(P: Integer): Boolean;
begin
  NextFood := False;
  if not Counter[P] then Counter[P] := True else
  begin
    Counter[P] := False;
    if P=1 then NextFood := True else
      NextFood := NextFood(P-1);
  end;
end;

function PCheck: Integer;
var
  I, J, C, PC, bufr, e: Integer;
  buf: Boolean;
  s: String;
begin
  C := 0;
  PC := 0;

  for I := 1 to N do
    if Counter[I] then C := C+Cost[I];

  for I := 1 to M do
  begin
    buf := True;
    for J := 1 to FPCount[I] do
      if not Counter[Pr[I,J]] then buf := False;
    if buf then PC := PC+PCost[I];
  end;
  PCheck := C-PC;
end;

function CountComb: Integer;
var
  I, M, P: Integer;
begin
  for I := 1 to N do
    Counter[I] := False;

  M := 0;
  while not NextFood(N) do
  begin
    P := PCheck;
    if P < M then M := P;
  end;
  CountComb := abs(M);
end;

begin
  InputData;
  WriteLn(CountComb);
end.