#include<iostream>
#include<math.h>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include<string>
#include<vector>
using namespace std;
#define INF 100000000
#define maxn 100010
#include<math.h>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include<string>
#include<vector>
using namespace std;
#define INF 100000000
#define maxn 100010
int s;
struct node{//注意为什么才用先更遍历 是因为到达某个节点之后就要停止,接下来的深度就不再返回i
int weight;
vector<int> child;
};
vector<node> tree;
bool cmp(int a,int b)
{
return tree[a].weight>tree[b].weight;
}
int path[maxn];
struct node{//注意为什么才用先更遍历 是因为到达某个节点之后就要停止,接下来的深度就不再返回i
int weight;
vector<int> child;
};
vector<node> tree;
bool cmp(int a,int b)
{
return tree[a].weight>tree[b].weight;
}
int path[maxn];
void DFS(int index,int nodenum,int sum)//注意这边球的是根到所有叶子结点的路径
{
if(sum>s) return;
if(sum==s)
{
if(!tree[index].child.empty()) return;
else
{
for(int i=0;i<nodenum;i++)
{
cout<<tree[path[i]].weight;
if(i<nodenum-1) cout<<" ";
else cout<<endl;
}
}
return;
}
for(int i=0;i<tree[index].child.size();i++)
{ int child=tree[index].child[i];//注意这边保存路径的方法,保存的是孩子节点 根节点要初始化 sun也要初始化
path[nodenum]=child;
DFS(child,nodenum+1,sum+tree[child].weight);//注下一个节点不是index+1
}
}
{
if(sum>s) return;
if(sum==s)
{
if(!tree[index].child.empty()) return;
else
{
for(int i=0;i<nodenum;i++)
{
cout<<tree[path[i]].weight;
if(i<nodenum-1) cout<<" ";
else cout<<endl;
}
}
return;
}
for(int i=0;i<tree[index].child.size();i++)
{ int child=tree[index].child[i];//注意这边保存路径的方法,保存的是孩子节点 根节点要初始化 sun也要初始化
path[nodenum]=child;
DFS(child,nodenum+1,sum+tree[child].weight);//注下一个节点不是index+1
}
}
int main()
{ int nodenum,nleaf;
cin>>nodenum>>nleaf>>s;
for(int i=0;i<nodenum;i++)
{
int weight;
node temp;
cin>>temp.weight;
tree.push_back(temp);
}
int start;
int end;
for(int i=0;i<nleaf;i++)
{ int id;
int num;
cin>>id>>num;
for(int j=0;j<num;j++)
{
int child;
cin>>child;
tree[id].child.push_back(child);
{ int nodenum,nleaf;
cin>>nodenum>>nleaf>>s;
for(int i=0;i<nodenum;i++)
{
int weight;
node temp;
cin>>temp.weight;
tree.push_back(temp);
}
int start;
int end;
for(int i=0;i<nleaf;i++)
{ int id;
int num;
cin>>id>>num;
for(int j=0;j<num;j++)
{
int child;
cin>>child;
tree[id].child.push_back(child);
}
sort(tree[id].child.begin(),tree[id].child.end(),cmp);//为了满足输出要求 只能改变孩子不能改变tree
}
//for(int i=0;i<tree.size();i++)
//cout<<tree[i].weight<<",";
path[0]=0;
DFS(0,1,tree[0].weight);
return 0;
}
sort(tree[id].child.begin(),tree[id].child.end(),cmp);//为了满足输出要求 只能改变孩子不能改变tree
}
//for(int i=0;i<tree.size();i++)
//cout<<tree[i].weight<<",";
path[0]=0;
DFS(0,1,tree[0].weight);
return 0;
}