#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
#define rep(i,b) loop(i,0,b)
#define loop(i,a,b) for(int i=(a);i<int(b);i++)

int s,d,m;
int k[128];
int w[128][64], p[128][64];
int f[128];
int dp[512];

void solve(){
    memset(dp,0,sizeof(dp));
    rep(i,d)rep(j,k[f[i]]){
        int p=::p[f[i]][j];
        int w=::w[f[i]][j];
        for(int l=m;;l--){
            if(l-p>=0)
                dp[l]=max(dp[l],dp[l-p]+w);
            else
                break;
        }
    }
    int ans=0;
    rep(i,m+1){
        if(dp[i]>dp[ans]){
            ans=i;
        }
    }
    cout<<dp[ans]<<" "<<ans<<endl;
}

int main(){
    while(cin>>s>>d>>m){
        rep(i,s){
            cin>>k[i];
            rep(j,k[i])cin>>w[i][j]>>p[i][j];
        }
        rep(i,d)cin>>f[i];
        solve();
    }
}

// fill_n( dp, m + 1, 0);
//         for(int i = 0 ; i < d ; i++ ){
//             int f;
//             cin >> f;
//             for(int j = 0 ; j < w[f].size(); j++){
//                 for(int k = m ; k - p[f][j] >= 0; k--){
//                     dp[k] = max( dp[k], dp[k - p[f][j]] + w[f][j]);
//                 }
//             }
//         }

//         int pos = 0;
//         for(int i = 0 ; i <= m ; i++ ){
//             if( dp[i] > dp[pos] ) pos = i;
//         }
//         cout << dp[pos] << " " << pos << endl;
//     }
// }