#include <bits/stdc++.h>
using namespace std;
template<typename T>inline void read(register T &x)
{
register T p = 1,num = 0;
char c = getchar();
while(c < '0'||c > '9')
{
if(c == '-') p = -p;
c = getchar();
}
while('0' <= c&&c <= '9')
{
num = (num<<3)+(num<<1)+(c^48);
c = getchar();
}
x = p * num;
}
template<typename T>inline void write(register T x)
{
if(x < 0) putchar('-'),x = -x;
if(x > 9) write(x/10);
putchar(x%10+48);
}
#define D(i,a,b) for(register int i=a;i>=b;--i)
#define F(i,a,b) for(register int i=a;i<=b;++i)
#define ll long long
#define N 200010
const int mod = 1e9 + 7;
int Q[N],val[N],ans[N],rt[N],n,m,qt;
struct node
{
#define ls u<<1
#define rs u<<1|1
#define mid (l+r)/2
unsigned ll a[N<<5];
int L[N<<5],R[N<<5];
int num;
node()
{
num = 1;
}
inline void pushup(int u)
{
a[u] = 114514ull * a[L[u]] + a[R[u]];
}
int update(int u,int v,int l,int r,int x)
{
if(!u) u = ++num;
if(l == r)
{
a[u] = a[v] + 1ull*x*x*x+x*x+2*x+20080520;
return u;
}
if(x <= mid) L[u] = update(L[u],v,l,mid,x),R[u] = R[v];
else R[u] = update(R[u],v,mid+1,r,x),L[u] = L[v];
pushup(u);
return u;
}
int cmp(int u,int v,int l,int r)
{
if(a[u] == a[v]) return 2;
if(a[u]&&!a[v]) return 1;
if(!a[u]&&a[v]) return 0;
if(l == r) return 2;
int x = cmp(L[u],L[v],l,mid);
if(x == 2) return cmp(R[u],R[v],mid+1,r);
return x;
}
void check(int u,int l,int r)
{
if(!u) return;
if(l == r)
{
if(a[u]) ans[l] = 1;
return;
}
check(L[u],l,mid);
check(R[u],mid+1,r);
}
}tree;
struct edge
{
int v,id;
bool friend operator<(const edge &X,const edge &Y) {return val[X.id] > val[Y.id];}
};
vector<edge> g[N];
struct cmp
{
bool operator ()(const int x,const int y)
{
return tree.cmp(rt[x],rt[y],1,m);
}
};
bitset<N> vis;
int main()
{
read(n),read(m),read(qt);
F(i,1,m)
{
int x,y;
read(x),read(y);
g[x].push_back((edge){y,i});
}
int cnt = qt;
F(i,1,qt)
{
read(Q[i]);
if(!val[Q[i]]) val[Q[i]] = ++cnt;
}
F(i,1,m)
if(!val[i])
val[i] = ++cnt;
F(i,1,n) sort(g[i].begin(),g[i].end());
priority_queue<int,vector<int>,cmp> q;
q.push(1);
rt[1] = 1;
while(q.size())
{
int u = q.top();
q.pop();
if(vis[u]) continue;
vis[u] = 1;
for(auto p:g[u])
{
int v = p.v,id = val[p.id];
if(vis[v]) continue;
int prt = 0;
prt = tree.update(prt,rt[u],1,m,id);
if(!rt[v]) rt[v] = prt;
else
{
if(!tree.cmp(prt,rt[v],1,m)) rt[v] = prt;
}
q.push(v);
}
}
tree.check(rt[n],1,m);
F(i,1,qt)
{
if(ans[Q[i]]) putchar('0');
else putchar('1');
ans[Q[i]] = 1;
putchar('\n');
}
return 0;
}