#include<iostream>#include<cstring>#include<vector>#include<algorithm>usingnamespace std;constint N =110;int n, m, S;int w[N];bool g[N][N];
vector<vector<int>> ans;//多维vector,相当于二维数组voiddfs(int u,int s, vector<int>&path)//u表示当前搜到了第几个点//s表示当前总和{bool is_leaf =true;for(int i =0; i < n; i ++)//判断是否是叶子节点if(g[u][i]){
is_leaf =false;break;}if(is_leaf){if(s == S) ans.push_back(path);//如果答案是目标值,在答案中加入路径}else///不是叶子节点{for(int i =0; i < n; i ++)if(g[u][i]){
path.push_back(w[i]);//搜索之前加入i的权值dfs(i, s + w[i], path);
path.pop_back();//搜完之后恢复现场}}}intmain(){
cin >> n >> m >> S;for(int i =0; i < n; i ++) cin >> w[i];while(m --)//读入每条表{int id, k;
cin >> id >> k;while(k --)//读入每个儿子{int son;
cin >> son;
g[id][son]=true;}}
vector<int>path({w[0]});//path初始化dfs(0, w[0], path);//从根节点开始暴搜sort(ans.begin(), ans.end(), greater<vector<int>>());//答案排序(从大到小for(auto p : ans)//输出所有路径{
cout << p[0];//p是一个vectorfor(int i =1; i < p.size(); i ++) cout <<' '<< p[i];
cout << endl;}return0;}