#include <iostream>
#include <bits/stdc++.h>

using namespace std;

#define REP(i,n) for(int i=0;i<(n);i++)
#define REP1(i,n) for(int i=1;i<(n);i++)
#define ALL(a)  (a).begin(),(a).end()
using ll = long long;
using ld = long double;
using Pint = pair<int, int>;
const ll mod = 1e9+7;

const int MX = 100005;
vector<Pint> g[MX];
int x[MX];
bool used[MX];

vector<int> ans;
int dfs(int v) {
  used[v] = true;
  int res = x[v];
  for(Pint e: g[v]) {
    if(used[e.first]) continue;
    int r = dfs(e.first);
    if(r) ans.push_back(e.second);
    // 0-0->0, 0-1->1, 1-0->1, 1-1->0なのでxorでスイッチするか決めて実行した後の親の状態が取れる
    res ^= r;
  }
  return res;
}


int main(int argc, char const* argv[])
{
  int n, m;
  cin>>n>>m;
  vector<Pint> as(n);
  REP(i,n) cin>>as[i].first>>as[i].second;
  sort(ALL(as));
  x[0] = as[0].second;
  REP(i,n-1) x[i+1] = as[i+1].second ^ as[i].second;
  x[n] = as[n-1].second;

  REP(i,m) {
    int l, r;
    cin>>l>>r;
    l = lower_bound(ALL(as), Pint(l,0)) - as.begin();
    r = upper_bound(ALL(as), Pint(r,1)) - as.begin();
    g[l].emplace_back(r,i+1);
    g[r].emplace_back(l,i+1);
  }

  REP(i,n+1) {
    if(used[i]) continue;
    if(dfs(i)) {
      cout << -1 << endl;
      return 0;
    }
  }

  cout << ans.size() << endl;
  if(ans.size()) {
    sort(ALL(ans));
    REP(i,ans.size()-1) printf("%d ", ans[i]);
    printf("%d\n", ans[ans.size()-1]);
  }

  return 0;
}