#include<bits/stdc++.h>
using namespace std;
#define int long long
#define fall(i,a,b) for(int i=a;i<=b;i++)
#define rfall(i,a,b) for(int i=a;i>=b;i--)
#define all(x) x.begin(),x.end()
#define sz(x) (int)x.size()
#define pb push_back
const int MAXN=3e5+10;
const int inf=1e16;
map<int,bool> mp[MAXN];
int n,m,k,pai[MAXN],root[MAXN],id[MAXN],cur,par[MAXN];
vector<int> rev[MAXN],cand,group[MAXN];
set<int> st;
int find(int x){
return x==par[x]?x:par[x]=find(par[x]);
}
void join(int a,int b){
a=find(a),b=find(b);
if(a==b) return;
par[b]=a;
}
void merge(int a,int b){
pai[b]=a;
if(sz(group[b])>sz(group[a])){
group[a].swap(group[b]);
id[a]=id[b];
}
for(auto x:group[id[b]]) group[id[a]].pb(x);
}
void bfs(int x){
queue<int> fila; fila.push(x);
id[x]=++cur;
while(!fila.empty()){
auto i=fila.front(); fila.pop();
group[cur].pb(i);
vector<int> ncd;
for(auto u:cand){
if(u==x) continue;
if(mp[u][i]) ncd.pb(u);
else{
pai[u]=i;
fila.push(u);
}
}
cand=ncd;
}
vector<int> to_pop;
for(auto r:st){
bool fd=0;
for(auto u:group[id[r]]){
if(mp[r][u]) continue;
for(auto j:group[id[x]]){
if(!mp[u][j]){
pai[u]=j;
if(u!=r) pai[r]=u;
fd=1;
break;
}
}
if(fd){
to_pop.pb(r);
merge(x,r);
break;
}
}
}
for(auto u:to_pop) st.erase(u);
st.insert(x);
}
int32_t main(){
std::ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin>>n>>m>>k;
fall(i,0,n-1) pai[i]=-1,par[i]=i;
bool da=1;
fall(i,1,m){
int a,b; cin>>a>>b;
if(find(a)==find(b)) da=0;
pai[a]=b; rev[b].pb(a);
join(a,b);
}
fall(i,1,k){
int a,b; cin>>a>>b;
mp[a][b]=1;
}
if(!da){
cout<<"NO\n";
return 0;
}
fall(i,0,n-1) if(pai[i]==-1) cand.pb(i);
fall(i,0,n-1){
if(pai[i]==-1) bfs(i);
}
if(sz(st)>1){
cout<<"NO\n";
return 0;
}
fall(i,0,n-1) if(pai[i]!=-1) cout<<i<<" "<<pai[i]<<"\n";
}