//
//./C<test
#include <bits/stdc++.h>
#define endl '\\n'
#define cediv(a,b) ((a)%(b)==0?((a)/(b)):((a)/(b))+1)
#define fi first
#define se second
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
template<typename T>
inline T umax(T &u, T v){return u = max(u, v);}
template<typename T>
inline T umin(T &u, T v){return u = min(u, v);}
pair<int,int> datas[2020];
int nums[2020]; // 각 canvas에 지금 얼마나 있는지
int pegs[2020];
vector<int> ans;
map<int,int> used;
int main(){
ios_base::sync_with_stdio(false); cin.tie(NULL);
int n,p;
cin>>n;
for(int i=0; i<n; i++){
cin>>datas[i].fi>>datas[i].se;
}
cin>>p;
for(int i=0; i<p; i++){
cin>>pegs[i];
used[pegs[i]]=1;
}
sort(pegs, pegs+p);
sort(datas, datas+n);
int l=0, r=0;
for(int i=0; i<n; i++){
while(l<p && pegs[l]<datas[i].fi) l++;
if(l>0 && datas[i].fi==pegs[l-1]) l--;
r=l;
while(r<p && pegs[r]<=datas[i].se){
r++;
}
nums[i]=r-l;
//cout<<"debug : "<<i<<' '<<nums[i]<<endl;
if(nums[i]>=3){
cout<<"impossible"<<endl;
return 0;
}
l=r;
}
for(int i=0; i<n; i++){
if(nums[i]>=2) continue;
else if(nums[i]==1){
if(i!=n-1 && nums[i+1]<2 && datas[i+1].fi==datas[i].se && !used[datas[i].se]){
ans.push_back(datas[i+1].fi);
nums[i]++;
nums[i+1]++;
}
else{
if(!used[(datas[i].se+datas[i].fi)/2]) ans.push_back((datas[i].se+datas[i].fi)/2);
else ans.push_back((datas[i].se+datas[i].fi)/2 + 1);
}
}
else{
// nums[i]=0;
if(i!=n-1 && nums[i+1]<2 && datas[i+1].fi==datas[i].se && !used[datas[i].se]){
ans.push_back((datas[i].se+datas[i].fi)/2);
ans.push_back(datas[i+1].fi);
nums[i]+=2;
nums[i+1]++;
}
else{
ans.push_back((datas[i].se+datas[i].fi)/2);
ans.push_back((datas[i].se+datas[i].fi)/2-1);
nums[i]+=2;
}
}
}
//sort(ans.begin(), ans.end());
//for(int i=1; i<ans.size(); i++) assert(ans[i-1]!=ans[i]);
cout<<ans.size()<<endl;
for(int i=0; i<ans.size(); i++) cout<<ans[i]<<' ';
cout<<endl;
return 0;
}