得了 20。
#include<iostream>
#include<vector>
#include<map>
#include<queue>
using namespace std;
int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-'){
f=-1;
}
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+(ch-'0');
ch=getchar();
}
return x*f;
}
const int MAXN=2e5+5;
int n,m;
struct edge{
int x,y;
}ed[MAXN];
vector<int> z[MAXN];
vector<int> g[MAXN];
int fa[MAXN];
int cd[MAXN];
int idx;
struct edgee{
int next,to;
}e[MAXN];
bool vis[MAXN];
int head[MAXN];
int f[MAXN][20];
int dep[MAXN];
int rd[MAXN];
map<pair<int,int>,bool>mp;
void add(int u,int v){
idx++;
e[idx].next=head[u];
e[idx].to=v;
head[u]=idx;
}
void dfs(int x){
f[x][0]=fa[x];
for(int k=1;k<=20;++k){
f[x][k]=f[f[x][k-1]][k-1];
}
if(!cd[x]){
g[x].push_back(x);
return;
}
for(int i=head[x];i;i=e[i].next){
int v=e[i].to;
if (v!=fa[x]){
dep[v]=dep[x]+1;
dfs(v);
for(int j=0;j<g[v].size();++j){
g[x].push_back(g[v][j]);
}
}
}
return;
}
int lca(int x,int y){
bool flag=0;
if (dep[x]<dep[y]){
swap(x,y);
flag=1;
}
for(int k=20;k>=0;--k) {
if(dep[f[x][k]]>=dep[y]){
x=f[x][k];
}
}
for(int k=20;k>=0;--k){
if(f[x][k]!=f[y][k]){
x=f[x][k];
y=f[y][k];
}
}
if(flag){
return y;
}
else{
return x;
}
}
signed main(){
n=read();
m=read();
for(int i=1;i<=m;++i){
int u,v;
u=read();
v=read();
z[u].push_back(v);
z[v].push_back(u);
ed[i]=edge{u,v};
}
for(int i=1;i<=n;++i){
cin>>fa[i];
cd[fa[i]]++;
add(fa[i],i);
add(i,fa[i]);
}
dfs(1);
idx=0;
for(int k=1;k<=n;++k){
if (!cd[k]){
for(int i=0;i<z[k].size();++i){
int v=z[k][i];
if(v!=fa[k]&&dep[v]==dep[fa[k]]){
int LCA=lca(v,fa[k]);
for(int j=0;j<g[LCA].size();++j){
add(k,g[LCA][j]);
rd[g[LCA][j]]++;
}
}
}
}
}
queue<int>q;
for(int i=1;i<=n;++i){
if (!rd[i]&&!cd[i]){
q.push(i);
vis[i]=1;
}
}
while(q.size()){
int x=q.front();
q.pop();
int xx=x;
while(fa[x]){
cout<<fa[x]<<' '<<x<<"\n";
mp[make_pair(fa[x],x)]=1;
mp[make_pair(x,fa[x])]=1;
x=fa[x];
if(vis[x]){
break;
}
vis[x]=1;
}
for(int i=head[xx];i;i=e[i].next){
int v=e[i].to;
rd[v]--;
if (!rd[v]&&!vis[v]){
vis[v]=1;
q.push(v);
}
}
}
for(int i=1;i<=m;++i){
if (mp[make_pair(ed[i].x,ed[i].y)]==1){
mp[make_pair(ed[i].x,ed[i].y)]=0;
mp[make_pair(ed[i].y,ed[i].x)]=0;
}
else{
cout<<ed[i].x<<" "<<ed[i].y<<"\n";
}
}
return 0;
}