#include <iostream>
#include <cstring>
using namespace std;

int s, d, m;
int k[302], w[302][302], p[302][302];
int f[302];

//dp1[i][j][k] : 甘味セットiの種類jまでで, 価格j分買い込んだときの, 最大体重
int dp1[102][52][302];
int dp2[102][302]; //期間iまでで, 価格jを使ったときの, 最大体重

void calcDP2(){
  memset(dp2, -1, sizeof(dp2));
  dp2[0][0] = 0;

  for(int i = 0; i < d; i++){ //期間i
    int st = f[i]; //期間iの甘味セット番号

    for(int j = 0; j <= m; j++){ //使った価格j
      if(dp2[i][j] == -1) continue;

      for(int l = 0; j + l <= m; l++){ //今から使おうとする価格l
	if(dp1[st][k[st]][l] == -1) continue;
	dp2[i + 1][j + l] = max(dp2[i + 1][j + l], dp2[i][j] + dp1[st][k[st]][l]);
      }
    }
  }
}

void calcDP1(){
  memset(dp1, -1, sizeof(dp1));

  for(int i = 0; i < s; i++){ //甘味セット番号
    dp1[i][0][0] = 0;

    for(int j = 0; j < k[i]; j++){ //甘味セットiの商品番号
      for(int l = 0; l <= m; l++){ //買い込んだ価格
	if(dp1[i][j][l] == -1) continue;
	int nj = j + 1;

	dp1[i][nj][l] = max(dp1[i][nj][l], dp1[i][j][l]);

	int nl = l + p[i][j];
	if(nl > m) continue;

	dp1[i][nj][nl] = max(dp1[i][nj][nl], dp1[i][j][l] + w[i][j]);
      }
    }
  }
}

void solve(){
  calcDP1();
  calcDP2();

  int maxEikyo = -1;
  int minCost = 0;

  for(int i = 0; i <= m; i++){
    if(maxEikyo < dp2[d][i] || maxEikyo == dp2[d][i] && minCost > i){
      maxEikyo = dp2[d][i];
      minCost = i;
    }
  }

  cout << maxEikyo << " " << minCost << endl;
}

int main(){
  while(cin >> s >> d >> m){
    for(int i = 0; i < s; i++){
      cin >> k[i];

      for(int j = 0; j < k[i]; j++){
	cin >> w[i][j] >> p[i][j];
      }
    }

    for(int i = 0; i < d; i++){
      cin >> f[i];
    }

    solve();
  }
}