#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
static const int MAX=10000;
static const int INFTY=(1<<20);
static const int W=0;
static const int G=1;
static const int B=2;

int n;
vector<pair<int ,int> > adj[MAX];

void dij(){
  priority_queue<pair<int ,int> > PQ;
  int color[MAX];
  int d[MAX];
  int i;

  for(i=0;i<n;i++){
    d[i]=INFTY;
    color[i]=W;
  }
  
  d[0]=0;
  PQ.push(make_pair(0,0));
  color[0]=G;

  while(!PQ.empty()){
    pair<int,int> f=PQ.top();
    PQ.pop();
    int u;
    u=f.second;
    color[u]=B;

    if(d[u]<f.first*(-1)) continue;

    int j;

    for(j=0;j<adj[u].size();j++){
      int v=adj[u][j].first;
      if(color[v]==B) continue;

      if(d[v]>d[u]+adj[u][j].second){
	d[v]=d[u]+adj[u][j].second;

	PQ.push(make_pair(d[v]*(-1),v));
	color[v]=G;
      }
    }
  }
  for(i=0;i<n;i++){
    cout<<i<<" "<<(d[i]==INFTY ? -1:d[i])<<endl;
  }
}

int main(){
  int k,u,v,c,i,j;

  cin>>n;
  for(i=0;i<n;i++){
    cin>>u>>k;
    for(j=0;j<k;j++){
      cin>>v>>c;
      adj[u].push_back(make_pair(v,c));
    }
  }
  dij();
  return 0;
}

