#include<bits/stdc++.h>
using namespace std;
int n,m,fa[100005],dep[100005],in[100005];
vector<int> vec[100005],top_vec[100005];
void BFS() {
queue<int> que;
memset(dep,127,sizeof(dep));
dep[1]=0;
que.push(1);
while(!que.empty()) {
int u=que.front();
que.pop();
for(auto v:vec[u]) {
if(dep[v]>dep[u]+1) {
dep[v]=dep[u]+1;
que.push(v);
}
}
}
}
map<pair<int,int>,int> ma;
void topsort() {
queue<int> que;
for(int i=1;i<=n;++i) {
if(!in[i]) que.push(i);
}
while(!que.empty()) {
int u=que.front();
que.pop();
int now=u;
while(now!=1) {
int num=ma[make_pair(now,fa[now])];
if(!num) break;
for(int i=1;i<=num;++i) {
cout << now << ' ' << fa[now] << '\n';
}
ma[make_pair(now,fa[now])]=ma[make_pair(fa[now],now)]=0;
}
for(auto v:top_vec[u]) {
in[v]--;
if(in[v]==0) que.push(v);
}
}
}
int u,v;
int main() {
cin >> n >> m;
for(int i=1;i<=m;++i) {
cin >> u >> v;
ma[make_pair(u,v)]++;
ma[make_pair(v,u)]++;
vec[u].push_back(v);
vec[v].push_back(u);
}
for(int i=1;i<=n;++i) cin >> fa[i];
BFS();
for(int u=1;u<=n;++u) {
for(auto v:vec[u]) {
if(dep[v]==dep[u]-1 && v!=fa[u]) {
top_vec[fa[u]].push_back(v);
in[v]++;
}
top_vec[u].push_back(fa[u]);
in[fa[u]]++;
}
}
topsort();
for(int u=1;u<=n;++u) {
for(auto v:vec[u]) {
int num=ma[make_pair(u,v)];
for(int i=1;i<=num;++i) cout << u << ' ' << v << '\n';
ma[make_pair(u,v)]=ma[make_pair(v,u)]=0;
}
}
return 0;
}