#include<iostream>
#include<vector>
#include<set>
using namespace std;
const int mx = 3e5+5;
typedef pair<int,int> pii;
int N, M, K;
vector<vector<int>> must(mx);
vector<set<int>> no(mx);
vector<int> in(mx, 0);
vector<bool> vis(mx, false);
vector<pii> ans;
bool flag = false;
void dfs(int now) {
vis[now] = 1;
for(int nxt:must[now]) {
dfs(nxt);
ans.push_back({nxt, now});
}
for(int nxt = 0; nxt<N; nxt++) {
if(no[now].find(nxt)!=no[now].end()) continue;
if(vis[nxt]) continue;
ans.push_back({nxt, now});
dfs(nxt);
}
}
bool check() {
for(int i=0; i<N; i++) {
if(in[i]>1) return false;
for(int j:must[i]) {
if(no[i].find(j)!=no[i].end()) return true;
}
}
return false;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin>>N>>M>>K;
vector<bool> v(mx, false);
for(int i=0; i<M; i++) {
int a, b;
cin>>a>>b;
must[b].push_back(a); // reverse
in[a]++;
v[a] = 1;
}
for(int i=0; i<K; i++) {
int a, b;
cin>>a>>b;
no[b].insert(a); // reverse
}
if(check()) {
cout<<"NO";
return 0;
}
int now;
vis = v;
for(int i=0; i<N; i++) {
if(vis[i]) continue;
now = i;
dfs(now);
}
ans.clear();
vis = v;
dfs(now);
for(int i=0; i<N; i++) {
if(ans.size()!=N-1) {cout<<"NO"; return 0;}
}
for(auto [x, y]:ans) cout<<x<<' '<<y<<'\n';
}