/*
TASK:TREES
LANG:C++
*/
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <vector>
using namespace std;
const int MAXN=(1<<16);
const int MAXK=(1<<7);

int N,M;
double K;
int Data[MAXN];
int Nest[MAXN];
int Dist[MAXN];
char CanCut[MAXN];
int CutCount;

void Read();
void Solve();
void AddNest(int i);

int main()
{
	Read();
	Solve();

	return 0;
}

void Read()
{
	scanf("%d%d%lf",&N,&M,&K);
	CutCount=N;
	int i,t;
	for(i=1;i<=N;i++)
	{
		scanf("%d",Data+i);
		CanCut[i]=1;
	}
	for(i=0;i<M;i++)
	{
		scanf("%d",&t);
		Nest[t]=1;
	}
}

void Solve()
{
	int i,maxdist=0;
	vector<int> r[MAXN];
	for(i=1;i<=N;i++)
	{
		int cc=Nest[i];
		int cur=i,d=0;
		while(cur!=0)
		{
			if(CanCut[cur]==1 && cc)
			{
				CanCut[cur]=0;
				CutCount--;
			}

			d++;
			cur=Data[cur];

			if(Dist[cur]&&cc==0)
			{
				Dist[i]=Dist[cur]+d;
				break;
			}
		}
		if(!Dist[i]) Dist[i]=d;
		int tmp=Dist[i];
		maxdist=maxdist>tmp?maxdist:tmp;
		r[tmp].push_back(i);
	}

	if(((double)CutCount/(double)N)*100 < K)
	{
		printf("%d\n",CutCount);
		return;
	}

	int MustCut=(int) ceil(((K/100)*(double)N));

	vector<int> res;
	res.reserve(MustCut);

	for(i=maxdist;i>0;i--)
	{
		int k=r[i].size()-1;
		while(MustCut && k>=0)
			if(CanCut[r[i][k]])
			{
				res.push_back(r[i][k]);
				MustCut--; k--;
			}
			else k--;
	}

	int k=res.size();
	sort(res.begin(),res.end());
	for(i=0;i<k-1;i++) printf("%d ",res[i]);
	printf("%d\n",res[k-1]);
}
