#include<iostream.h>
#include <vector>

const int MAX_INT=999999;
int graph[200][200];
int T[200];
int nk[200];
int t1[200];

int SIZE;

class ED
{
public :
  int val;
  int from;
  int to;
  
};


vector<ED> heap;
vector<int> set1;
vector<int> set2;
int n,t,k;




int dij()
{
  
 
  bool mark[SIZE];
  vector<bool> extracted(SIZE);
  ED e;
  int i,j,min;
  for(i=0;i<SIZE;i++)
    {
      mark[i] = false;
      if(nk[i]>=k)
	{
	  t1[i]=T[i];
	  set1.push_back(i);
	  //	  cout << "\npushed L : " << i;
	  mark[i] = true;
	  if(i==t)
	    {
	      return 1;
	    }
	  
	  for(j=0;j<n;j++)
	    {
	      if(graph[i][j]!=-1)
		{
		  
		  e.val = t1[i]+T[j]+graph[i][j];
		  e.from = i;
		  e.to = j;
		  heap.push_back(e);
		}
	    }
	}
      else
	set2.push_back(i);
    }


  for(i=0;i<set1.size();i++)
    {
      for(j=i+1;j<set1.size();j++)
	{
	  if(t1[set1[i]]>t1[set1[j]])
	    {
	      int temp=set1[i];
	      set1[i]=set1[j];
	      set1[j]=temp;
	      
	    }
	}
    }
  
  while(1)
    {
      min = -1;
      for(i=0;i<heap.size();i++)
	{
	  if((min == -1 || heap[i].val<heap[min].val) && mark[heap[i].to] == false)
	    min = i;
	}
      if(min==-1)
	{
	  cout<<"-1\n";
	  return -1;
	}
      e = heap[min];
      nk[heap[min].to]++;
      i=heap[min].to;
     
      
      heap.erase(heap.begin()+min);

     
      if(nk[i]>=k)
	{
	  t1[i] = e.val;
	  set1.push_back(i);
	  mark[i]=true;
	  //	  cout << "\npushed : " << i;
	  if(i==t)
	    return 1;
	  // add edges
	  for(j=0;j<SIZE;j++)
	    {
	      if((graph[i][j]!=-1)&&(mark[j]==false))
		{
		  e.val = t1[i]+T[j]+graph[i][j];
		  e.from = i;
		  e.to = j;
		  heap.push_back(e);
		  
		}  
	    }
	}
    }
}
int main()
{

  cin >> n >> t >> k;

  SIZE=n;
  int i,j,val,val1;


  for(i=0;i<n;i++)
    for(j=0;j<n;j++)
	  graph[i][j]=-1;
	
  for(i=0;i<n;i++)
    {
      cin >> val;
      T[i]=val;

      while(1)
	{
	  cin >> val;
	  if(val==-1)
	    break;

	  cin >> val1;
	  graph[val][i]=val1;
	  //	  cout << "\nval : " << val << " " << val1;
	  
	}
      
    }

  // now assign value of k

  for(i=0;i<n;i++)
    {
      int count=0;
      for(j=0;j<n;j++)
	{
	  if(graph[j][i]!=-1)
	    count++;
	}
      if(count==0)
	nk[i]=k;
	  
    }

  // got the k values

  // now call dij

  if(dij()==-1)
    return 1;


  
  for(i=0;i<set1.size();i++)
    {

      cout << set1[i] << " " << t1[set1[i]] << endl;

    }
  

  
  
  
  
  
}



















