#include <bits/stdc++.h>
long long inf = 1LL << 62;
long long mod = 1000000007;
using namespace std;
typedef struct {
  long long pre, suf, mx, sum;
} node;
node st[1000002], b[52];
long long a[250002];
long long t[5002];
node combine(node L, node R) {
  node M;
  M.mx = max(L.mx, R.mx);
  M.mx = max(M.mx, L.suf + R.pre);
  M.sum = L.sum + R.sum;
  M.pre = max(L.pre, L.sum + R.pre);
  M.suf = max(R.suf, R.sum + L.suf);
  return M;
}
void build(int p, int l, int r) {
  if (l == r) {
    st[p] = b[a[l]];
    return;
  }
  build(2 * p, l, (l + r) / 2);
  build(2 * p + 1, (l + r) / 2 + 1, r);
  st[p] = combine(st[2 * p], st[2 * p + 1]);
}
int main(void) {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n, m;
  cin >> n >> m;
  for (int j = 1; j <= n; j++) {
    int s;
    cin >> s;
    b[j] = {-10000, -10000, -10000, 0};
    long long temp = 0;
    for (int i = 0; i < s; i++) {
      cin >> t[i];
      b[j].sum += t[i];
    }
    for (int i = 0; i < s; i++) {
      temp += t[i];
      b[j].pre = max(b[j].pre, temp);
    }
    temp = 0;
    for (int i = s - 1; i >= 0; i--) {
      temp += t[i];
      b[j].suf = max(b[j].suf, temp);
    }
    temp = 0;
    for (int i = 0; i < s; i++) {
      temp += t[i];
      b[j].mx = max(b[j].mx, temp);
      if (temp < 0) temp = 0;
    }
  }
  for (int i = 0; i < m; i++) {
    cin >> a[i];
  }
  build(1, 0, m - 1);
  cout << st[1].mx;
  return 0;
}
