rt
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/hash_policy.hpp>
const int N=1e3+10,p=1e9+7;
__gnu_pbds::gp_hash_table<int,int>f[N];
int fact[N],n,m,t,ny[N],nyp[N],k;
inline int max(int x,int y){return x>y?x:y;}
inline int qum(int a,int b){
int ans=1;
while(b){
(b&1)&&(ans=1ll*ans*a%p);
a=1ll*a*a%p;
b>>=1;
}
return ans;
}
signed main(){
scanf("%d",&t);fact[0]=1;
for(int i=1;i<=1000;i++)fact[i]=1ll*fact[i-1]*i%p;
ny[1000]=qum(fact[1000],p-2);
for(int i=999;i;i--)ny[i]=1ll*ny[i+1]*(i+1)%p;
for(int i=1;i<=1000;i++)nyp[i]=1ll*fact[i-1]*ny[i]%p;
while(t--){
scanf("%d%d",&n,&m);
int ans=0;
for(int i=m-n;i<=m;i++)f[0][i]=1;
for(k=1;k<=n;k++){
f[k][1]=ny[k];
for(int i=max(m-n/k,0);i<=m;i++){
for(int j=1;j<=n;j++){
f[j][i]=1ll*nyp[j]*i%p*(f[j-1][i]-((j-k-1>=0)?1ll*ny[k]*f[j-k-1][i-1]:0)%p+p)%p;
}
}
ans=(k^n)?(ans+f[n][m])%p:(1ll*n*f[n][m]%p-ans+p)%p;
}
ans=1ll*ans*fact[n]%p;
printf("%d\n",ans);
}
}