 	int u, v, edge_count = 0, max = -1;
 	while (getline(infile, su, '\t') && getline(infile, sv)) {
         // Node ids assumed to be 1-indexed and decremented to be 0-indexed
-        u = std::stoi(su) - 1;
-        v = std::stoi(sv) - 1;
+        u = std::atoi(su.c_str()) - 1;
+        v = std::atoi(sv.c_str()) - 1;
 
         // Dynamically add empty vectors as nodes are found in edge list
         int new_max = u > v ? u : v;


    // Create and initialize CUDA thread output structs
    std::vector<EDGE_OUTPUT> outputs(E_num);
    outputs.resize(E_num, {0});

    // Pointers of V, E_u, E_v, and edge outputs in GPU memory
    int* V_ptr;

    int V_size = (V_num + 1) * sizeof(int);
    int E_size = E_num * sizeof(int);
    int outputs_size = E_num * sizeof(EDGE_OUTPUT);

    // Malloc GPU memory and store location in pointers
    cudaMalloc((void**)&V_ptr, V_size);
    cudaMalloc((void**)&E_ptr, E_size);
