#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+5;
const int mod=1e9+7;
/*
因为是有向的无环图,要找(i,j)之间的路径数,
肯定是考虑toposort就可以了
然后就是考虑怎么统计cnt(i,j)*a[i]*b[j]
如果cnt[i]表示到达i的种类,res[i]表示所有到达i点的cnt[*]*a[*]
的和,那么最后res[i]*b[i]就是最后的答案
*/
int head[maxn],nxt[maxn],val[maxn];
ll res[maxn],tot;
int a[maxn],b[maxn],deg[maxn];
void init(){
tot=0;
memset(head,-1,sizeof(head));
memset(res,0,sizeof(val));
memset(deg,0,sizeof(deg));
}
void add(int u,int v){
val[tot]=v;
nxt[tot]=head[u];
head[u]=tot++;
}
int n,m,u,v;
void solve(){
queue<int> q;
for(int i=1;i<=n;i++)
if(!deg[i])q.push(i);
while(!q.empty()){
u=q.front();q.pop();
for(int i=head[u];i!=-1;i=nxt[i]){
v=val[i];
res[v]=(res[v]+res[u]+a[u])%mod;
deg[v]--;
if(!deg[v])q.push(v);
}
}
}
int main(){
while(~scanf("%d%d",&n,&m)){
init();
for(int i=1;i<=n;i++)scanf("%d%d",a+i,b+i);
for(int i=0;i<m;i++){
scanf("%d%d",&u,&v);
add(u,v);
deg[v]++;
}
solve();
ll ans=0;
for(int i=1;i<=n;i++)
ans=(ans+res[i]*b[i])%mod;
printf("%lld\n",ans);
}
return 0;
}